【问题标题】:The most correct way to iterate over a list in haskell, and return the element for which a condition is true在haskell中迭代列表并返回条件为真的元素的最正确方法
【发布时间】:2023-03-03 04:19:01
【问题描述】:

我有一个函数,它接受一些参数并调用另一个函数,该函数返回 [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 然后如果谓词为真则返回该项目。

如果谓词不适用于所有项目,那么我会在列表中的每个项目上递归调用 f,我意识到这会给我多个“t”,我知道如何将它们组合成一个 t 以匹配我的签名。

我发现了这个:

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

但条件的结构看起来与我尝试做的不同。

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

【问题讨论】:

  • 不幸的是,这个描述留下了太多的模棱两可,无法轻易回答。 (例如,如果a_1a_2 都满足谓词会发生什么——返回a_1 还是它们组合在一起?如果a_1a_n 都不满足,但g a_1 怎么办?有两个满足谓词的元素,g a_2 有另一个?你在说什么样的“组合”?)你能解释一下你试图解决的具体问题,即使是简化形式,或者给我们一些具体例子?
  • 从 Prelude (here) 中查看 filter 的定义可能会很有用,并根据您的需要进行调整 - 它似乎是您尝试的关键组成部分做(至少据我所知)。或者作弊并使用来自Data.Listfind
  • 你需要改进你的问题以避免它被关闭,如果你的问题很清楚,你更有可能得到有用的答案。请查看如何提问:stackoverflow.com/help/how-to-ask

标签: haskell recursion functional-programming


【解决方案1】:

如果你定义呢

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2015-04-27
    • 2021-09-13
    • 1970-01-01
    • 2013-03-24
    相关资源
    最近更新 更多