gpt4 book ai didi

list - Haskell isMember 函数错误

转载 作者:行者123 更新时间:2023-12-04 14:23:16 25 4
gpt4 key购买 nike

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 和递归的新手,所以像我五岁一样解释。)

最佳答案

你快到了

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

编译器告诉你你 promise 接受任何类型的列表成员 - 但后来你使用函数 ==这不适用于所有类型(例如函数)。

通过添加 Eq a =>你说我接受所有具有 equals 方法的输入。

一些附加说明

您可以(重新)将最后一行写为
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

    关于list - Haskell isMember 函数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46962107/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com