我正在学习Haskell,我不明白为什么我能这样做:
f :: [Int] -> Bool
f l
| l==l = True
| otherwise = False
但我不能这样做。
f :: [a] -> Bool
f l
| l==l = True
| otherwise = False
引擎盖下发生了什么?
答案 0 :(得分:23)
给定任意类型的两个值,Haskell不一定知道如何比较它们的相等性。 ==
仅针对属于Eq
类的类型定义。
例如,确定两个函数是否相等通常是不可判定的(我认为)。
您可以通过检查每个元素是否等于另一个列表中的对应元素来比较两个列表。但是,这只有在比较元素的相等性时才有意义,所以你必须添加一个约束:
f :: Eq a => [a] -> Bool
答案 1 :(得分:2)
我会在 Real World Haskell
中指出关于类型类的章节http://book.realworldhaskell.org/read/using-typeclasses.html