haskell - 使用递归或高阶函数编写函数

标签 haskell

如何编写带有谓词的函数 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/

相关文章:

haskell - 了解 Parsec 中的 SourceName

parsing - 使用 Haskell 将随机嵌套列表展平为非嵌套列表

haskell - Haskell中的固定长度循环缓冲区

Haskell 在一种条件下定义多个变量?

haskell - StateT s (ExceptT e m) 和 exceptT e (StateT s m) 有什么区别?

performance - Haskell - 缓存函数调用的简单方法

haskell - 查找序列 1/1 1/2 1/1 2 1 1 中的第 n 代

haskell - 使用 Megaparsec 使用开始和结束符号解析 block 注释

Haskell:在惰性 IO 中隐藏故障

list - Haskell:一个列表与另一个列表的子序列的叉积