【问题标题】:Is it possible to implement filter using foldl instead of foldr?是否可以使用 foldl 而不是 foldr 来实现过滤器?
【发布时间】:2012-11-24 18:26:40
【问题描述】:

是否可以使用 foldl 而不是 foldr 来实现过滤器?如果是这样,请温和地解释你的实现。

【问题讨论】:

  • 除此之外,我很高兴我今天敢于提问并学到了一些新东西(差异列表)。这是值得的耻辱! ;)
  • 作为评论回答,因为它已关闭:不,这是不可能的,嗯,有点。 filter 可以在给定无限列表时产生输出,foldl 不能。因此,您必须对输入进行分块并逐块使用 foldl-filter,将结果连接起来。对于处理有限列表,hammar 的解决方案效率最低。
  • @DanielFischer tnx 添加此内容
  • @GeorgeStocker 不是一个真正的问题?很难说出在问什么?无法合理回答?这些描述都不适合这个问题。如果您想结束一个问题,请选择一个真正的原因。如果 SO 给出的任何密切原因都不适合该问题,则表明 SO 政策是问题不应该关闭,如果您认为应该更改政策,您应该开始讨论 meta .
  • 这太荒谬了。请投票重新提出这个问题。这是完全可以接受的。

标签: haskell functional-programming


【解决方案1】:

使用difference lists

filter' :: (a -> Bool) -> [a] -> [a]
filter' p xs = foldl (\k x -> if p x then k . (x:) else k) id xs []

【讨论】:

  • 感谢您添加此答案并向我介绍不同的列表。通过问这个问题真的学到了一个新概念。
  • filter' even [1 .. ]foldl never 可以在输入无限列表时产生任何东西。
【解决方案2】:

如果您想保持列表的顺序,效率并不高。天真的方法是将其更改为 foldl 然后反转结果列表。

【讨论】:

    【解决方案3】:

    想出了这个:

    myFilter p coll =
      foldl step [] coll where 
        step acc e  
          | p e = acc ++ [e] 
          | otherwise = acc
    

    这不是很有效,因为它必须在列表末尾插入一个元素。

    【讨论】:

      猜你喜欢
      • 2016-09-04
      • 2016-08-29
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 2020-03-22
      • 2011-09-04
      相关资源
      最近更新 更多