我有一个函数,该函数接受一些参数,然后调用另一个函数,该函数返回格式为[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?
但是这种情况的结构看起来与我试图做的不同。
有人可以指出我正确的方向吗?
答案 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