收到以下错误:
• No instance for (Num [Int]) arising from the literal ‘5’
• In the second argument of ‘(==)’, namely ‘5’
In the expression: x == 5
In the expression: if x == 5 then True else False
尝试加载haskell函数时:
listContainsFive :: [Int] -> Bool
listContainsFive [] = error "empty list"
listContainsFive x = if x == 5 then True else False
listContainsFive (x:xs) = listContainsFive xs
我不确定问题是什么,我对Haskell很新。
答案 0 :(得分:4)
listContainsFive
的参数的类型为[Int]
。因此,在listContainsFive x = if x == 5 then True else False
中,x
的类型为[Int]
。由于您要比较x
和5
,并且==
的两个操作数必须具有相同的类型,5
也必须具有[Int]
类型。该错误消息是GHC告诉您无法找到使5
具有列表类型的方法的方式。
我不确定您的意图是匹配单个元素列表,让x
引用该列表的元素,或者您的意图是x
引用任何非空列表的头部。在前一种情况下,您应该使用模式[x]
而不是x
。在后一种情况下,您应该使用与以下行((x:xs)
)相同的模式 - 实际上您应该合并这些行,否则下一个模式将是多余的。
请注意,如果您的目的是仅匹配具有该模式的单元素列表,则您的函数将仅检查5是否是列表的最后一个元素,而函数的名称表明它检查列表是否包含5。因此,无论是你的逻辑还是你的名字在这种情况下都是错误的。
答案 1 :(得分:1)
您的类型签名表示该参数为[Int]
(一个Int列表),但您将其与==
与5
进行比较,其中只有一个Int
。您可以对x:[]
(或等效[x]
)进行模式匹配,然后比较x == 5