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

时间:2012-11-23 19:12:32

标签: haskell functional-programming

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

3 个答案:

答案 0 :(得分:9)

使用difference lists

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

想出这个:

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

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