是否可以使用foldl而不是foldr来实现过滤器?如果是这样,请轻轻解释您的实施。
答案 0 :(得分:9)
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
它不是很有效,因为它必须在列表的末尾插入一个元素。