我試圖理解爲什麼Haskell的show
將 視爲一個不同於列表的字符列表。整數 即使沒有FlexibleInstances
Pragma。Haskell如何爲類型實例選擇方法?
已經通過Show
文檔閱讀,我意識到 ,我真的不明白的Haskell如何選擇類型的類的實例方法 。
考慮下面的代碼:
class MyShow a where
myShow :: a -> String
myShowList :: [a] -> String
myShowTuple :: (a, b) -> String
myShowList xs = "Default List Implementation"
myShowTuple t = "Default Tuple Implementation"
instance MyShow Char where
myShow c = "One Char"
myShowList xs = "List of Chars"
myShowTuple t = "Char Tuple"
instance MyShow Int where
myShow n = "One Int"
myShowList xs = "List of Integers"
myShowTuple t = "Int Tuple"
instance MyShow Float where
myShow n = show n
instance (MyShow a) => MyShow [a] where
myShow = myShowList
instance (MyShow a) => MyShow (a, b) where
myShowTuple t = "foo"
myShow = myShowTuple
現在,如果我打電話例如
myShow (5::Int,5::Int)
我預計哈斯克爾認爲 「哦,myShow
有一個元組作爲參數。我們來看看哪個 實現。「 ,並選擇最後一個作爲回報會導致 在"foo"
。顯然,情況並非如此。 Haskell似乎在查看元組的內容(即 的類型爲a
)並決定調用相應的方法, 導致"Int Tuple"
。
這是爲什麼?
謝謝您的回答,但我還是不明白,爲什麼在第二到最後一行'myShowTuple'已鍵入'(( a,c),b)'因爲元組不是MyShow的唯一實例。 – Aton
@Aton(重命名類型變量以避免歧義)。因爲在MyShow t的類定義中有'myShowTuple ::(t,t2) - > String',並且在第二行到最後一行,你在MyShow(a,b)'的實例定義中,所以't'是'(a,b)',因此'(t,t2) - > String'變爲'((a,b),t2) - > String'。 – sepp2k