Haskell 是否可以使用foldl而不是foldr实现过滤器?

Haskell 是否可以使用foldl而不是foldr实现过滤器?,haskell,functional-programming,Haskell,Functional Programming,是否可以使用foldl而不是foldr实现过滤器?如果是这样,请温和地解释您的实现。如果您想保持列表的顺序,则效率不高。最简单的方法是将其更改为foldl,然后反转生成的列表。提出了以下方法: myFilter p coll = foldl step [] coll where step acc e | p e = acc ++ [e] | otherwise = acc 它不是很有效,因为它必须在列表末尾插入一个元素。使用: 感谢您添加此答案并向我

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

如果您想保持列表的顺序,则效率不高。最简单的方法是将其更改为foldl,然后反转生成的列表。

提出了以下方法:

myFilter p coll =
  foldl step [] coll where 
    step acc e  
      | p e = acc ++ [e] 
      | otherwise = acc
它不是很有效,因为它必须在列表末尾插入一个元素。

使用:


感谢您添加此答案并向我介绍差异列表。问这个问题真的学到了一个新概念。
filter'even[1..]
foldl
如果有一个无限的列表,就永远不会产生任何东西。除此之外,我很高兴今天我敢于提问并学到了一些新东西(差异列表)。这是值得羞愧的!;)作为评论回答,因为它已经关闭了:不,这是不可能的,嗯,有点<当给定无限列表时,代码>过滤器可以生成输出,
foldl
不能。因此,您必须将输入分块,并使用foldl过滤器分块,将结果连接起来。对于处理有限列表,hammar的解决方案效率最低。@DanielFischer tnx For Addthis@GeorgeStocker不是真正的问题吗?很难说被问到什么?无法合理回答?这些描述都不符合这个问题。如果你想结束一个问题,选择一个真正的原因。如果SO给出的所有结束理由都不符合问题,这表明SO的政策是不应该结束问题,如果你觉得政策应该改变,你应该开始讨论meta。这是荒谬的。请投票重新开始这个问题。这是完全可以接受的。
filter' :: (a -> Bool) -> [a] -> [a]
filter' p xs = foldl (\k x -> if p x then k . (x:) else k) id xs []