为什么我不能编写一般函数来检查两个列表是否相等?

时间:2011-12-25 06:54:28

标签: haskell

我正在学习Haskell,我不明白为什么我能这样做:

f :: [Int] -> Bool
f l  
    | l==l = True
    | otherwise = False

但我不能这样做。

f :: [a] -> Bool
f l  
    | l==l = True
    | otherwise = False

引擎盖下发生了什么?

2 个答案:

答案 0 :(得分:23)

给定任意类型的两个值,Haskell不一定知道如何比较它们的相等性。 ==仅针对属于Eq类的类型定义。

例如,确定两个函数是否相等通常是不可判定的(我认为)。

您可以通过检查每个元素是否等于另一个列表中的对应元素来比较两个列表。但是,这只有在比较元素的相等性时才有意义,所以你必须添加一个约束:

f :: Eq a => [a] -> Bool

答案 1 :(得分:2)

我会在 Real World Haskell

中指出关于类型类的章节

http://book.realworldhaskell.org/read/using-typeclasses.html