如何编写带有谓词的函数 f
和一个列表 xx
如果 fx
,则返回 true对某些人来说确实如此 x∈xs
?
例如:
ghci>exists (>2) [1,2,3]
True
这是我写的函数:
exists :: (t->Bool)->[t]->Bool
exists f a []=error
exists f a (x:xs)
|if x∈f a =True
|otherwise= x:f a xs
我知道这是不对的,但我不知道为什么。我需要写这个谓词函数
f
吗?首先,然后在函数内部使用它 exists
.因为我真的不知道如何比较列表中的一个元素 xs
与功能。
最佳答案
您想要的示例用法是这样的
ghci>exists (>2) [1,2,3]
True
停止。胡闹时间。 ( <------ 这应该是 Haskell 的座右铭 imho)
您需要一个带有两个参数的函数(“存在”)。第一个是一元函数
(a -> Bool)
第二个是列表 [a]
.所需的结果是 Bool
Hoogling that type signature ,
(a -> Bool) -> [a] -> Bool
,点击率最高的是 any
, all
, 和 find
.正如安德鲁所指出的,any
是一个行为类似于“存在”函数的函数。作为旁注,我的第一个想法是使用
find
, 返回 Maybe a
,然后模式匹配。如果返回 Nothing
,那么结果将是 False
, 否则 True
.作为另一边注,actual implementation就是
any p = or . map p
.第三个旁注可能是您实际问题的答案。怎么样
map
定义? Hoogle 再次成为您的 friend 。搜索方法的名称,您可以找到链接到源的页面。我建议您为 map
执行此操作和 or
,但只会显示 map
这里。map _ [] = []
map f (x:xs) = f x : map f xs
这是递归列表的基本方法。
recursiveCall f (x:xs) = f x : recursiveCall f xs
但是如果可以写成map
, filter
, 或 foldl
/foldr
,那么你应该用这些递归方法来做。 (停止。Hoogle time。搜索这些方法名称并查看源代码;这非常简单。)
关于haskell - 使用递归或高阶函数编写函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4777130/