如何不使用递归与elem函数实现判断元素是否存在于列表的功能
思路可行性判断
你的实现思路是完全可行的,filter非常适合用来实现这个需求。
当前代码问题
你写的elementIsInList x xs = filter(x==xs) xs存在两处核心错误:
filter的第一个参数需要是接收单个列表元素、返回布尔值的谓词函数,你当前写的x==xs是把目标值x和整个列表xs做相等判断,不仅逻辑不对,类型也无法匹配。filter返回的是符合条件的元素组成的子列表,类型是[a],和你函数要求的返回值Bool不匹配。
正确实现代码
elementIsInList :: Eq a => a -> [a] -> Bool elementIsInList x xs = not $ null $ filter (== x) xs
实现逻辑说明
(== x)是偏应用生成的谓词函数:传入任意和x同类型的值,会返回两者是否相等的布尔结果filter (== x) xs会遍历列表xs,保留所有等于x的元素,返回这些元素组成的新列表- 如果新列表非空,说明
x存在于原列表中,用not . null即可把列表的非空状态转成要求的布尔返回值
可选精简写法
你也可以写成无参数风格的写法,逻辑完全一致:
elementIsInList :: Eq a => a -> [a] -> Bool elementIsInList x = not . null . filter (== x)
内容的提问来源于stack exchange,提问作者BeanieBarrow
相关产品推荐
相关产品推荐

