3

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

4

3 回答 3

9

使用差异列表

filter' :: (a -> Bool) -> [a] -> [a]
filter' p xs = foldl (\k x -> if p x then k . (x:) else k) id xs []
于 2012-11-23T19:34:37.643 回答
3

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

于 2012-11-23T19:18:30.217 回答
2

想出了这个:

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

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

于 2012-11-23T19:30:08.477 回答