我试图理解为什么即使没有Pragma ,Haskellshow
也会将字符列表与例如整数列表不同。FlexibleInstances
阅读了 的文档后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)
我希望 Haskell 认为‘哦,myShow
有一个元组作为参数。让我们看看我必须调用哪个实现。并选择最后一个作为回报的结果"foo"
。显然,事实并非如此。Haskell 似乎在看元组的内容(即 的类型a
)并决定调用相应的方法,结果是"Int Tuple"
.
为什么是这样?