遍历haskell中的列表并返回条件为true的元素的最正确方法

时间:2019-06-01 20:12:22

标签: haskell recursion functional-programming

我有一个函数,该函数接受一些参数,然后调用另一个函数,该函数返回格式为[a_1,a_2,...,a_n]的列表。

我要做的是在列表中的每个项目上调用谓词p,然后返回其p(a_i)= True的项目。

如果没有,那么我将对所有a_i递归重复该算法。

结构如下:

f :: t -> t
f =  (g t) --this is a list
     (p ?) -- p is a predicate on each element 

我想在列表中的每个项目上调用此谓词p,然后在谓词为true时返回该项目。

如果谓词不适合所有项目,那么我递归地调用列表中的每个项目,我意识到这会给我多个“ t”,我知道该如何组合成单个t来匹配我的签名。 / p>

我发现了:

How to get out of iterate loop when a condition is met?

但是这种情况的结构看起来与我试图做的不同。

有人可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

如何定义

satisfies:: [t]-> (t -> Bool) -> Maybe t

表示satisifies获取一个列表和一个谓词,并返回一个Maybe of an element。这是一种表示可能不存在满足谓词的元素的方式(它使函数 total ,意味着它总是被定义)。

现在,如果列表为空,则返回值为Nothing

satisfies [] _ = Nothing

最后,

satisfies (x:xs) p = case p x of
    True -> Just x
    False -> satisfies xs p