Haskell是会员功能错误

时间:2017-10-26 19:13:22

标签: list haskell functional-programming

isMember:: a -> [a] -> Bool
isMember y [] = False
isMember y (x:xs) =
 if y == x then
  True
 else
  isMember y xs

尝试创建一个函数,以识别某些东西是否是列表的成员。例如:

isMember 6 [1,2,3,4,5,6]
>True

然而,我一直得到一个编译器错误,声明'因使用'=='而没有(Eq a)的实例

帮助将不胜感激(我是函数语言中的Haskell& Recursion的新手,所以解释就像我五岁。)

1 个答案:

答案 0 :(得分:8)

你快到了

isMember :: Eq a => a -> [a] -> Bool
isMember _ [] = False
isMember y (x:xs) =
 if y == x then True else isMember y xs

编译器告诉您,您承诺接受任何类型的列表成员 - 但稍后您使用的函数==并非适用于所有类型(例如函数)。

通过添加Eq a =>,您说我接受所有具有等号方法的输入。

一些附加说明

您可以(重新)将最后一行写为

isMember y (x:xs) = (y == x) || isMember y xs

这相当于你的实现(感谢@chi的评论)。 你的版本有什么好处,它是尾递归的。

需要注意的另一点 - 模式:

  • 返回空列表案例(isMember _ [] = False
  • 并使用此值(isMember y (x:xs) = ...
  • 遍历列表

碰巧出现了很多,并被抽象为fold - 函数(foldlfoldr ...)的家庭。把它放在你的用例中就好像是

isMember y xs = foldl False (\x b -> (x == y) || b) xs