Haskell错误没有来自文字的实例

时间:2018-01-01 14:20:21

标签: haskell

收到以下错误:

• 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很新。

2 个答案:

答案 0 :(得分:4)

listContainsFive的参数的类型为[Int]。因此,在listContainsFive x = if x == 5 then True else False中,x的类型为[Int]。由于您要比较x5,并且==的两个操作数必须具有相同的类型,5也必须具有[Int]类型。该错误消息是GHC告诉您无法找到使5具有列表类型的方法的方式。

我不确定您的意图是匹配单个元素列表,让x引用该列表的元素,或者您的意图是x引用任何非空列表的头部。在前一种情况下,您应该使用模式[x]而不是x。在后一种情况下,您应该使用与以下行((x:xs))相同的模式 - 实际上您应该合并这些行,否则下一个模式将是多余的。

请注意,如果您的目的是仅匹配具有该模式的单元素列表,则您的函数将仅检查5是否是列表的最后一个元素,而函数的名称表明它检查列表是否包含5。因此,无论是你的逻辑还是你的名字在这种情况下都是错误的。

答案 1 :(得分:1)

您的类型签名表示该参数为[Int](一个Int列表),但您将其与==5进行比较,其中只有一个Int。您可以对x:[](或等效[x])进行模式匹配,然后比较x == 5