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的新手,所以解释就像我五岁。)
答案 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
- 函数(foldl
,foldr
...)的家庭。把它放在你的用例中就好像是
isMember y xs = foldl False (\x b -> (x == y) || b) xs