是否可以使用 foldl 而不是 foldr 来实现过滤器?如果是这样,请温和地解释你的实现。
问问题
649 次
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 回答