2012-11-23 73 views
3

是否可以使用foldl而不是foldr來實現過濾器?如果是這樣,請輕輕解釋你的實施。是否可以使用foldl而不是foldr來實現過濾器?

+0

要添加到這一點,我很高興我不敢問及今天學到新的東西(差異表)。這是值得的恥辱! ;) –

+3

答案作爲評論,因爲它已關閉:不,這是不可能的,好吧,有點。當給定一個無限列表時,'filter'可以產生輸出,'foldl'不能。所以你不得不大塊你的輸入,並使用foldl過濾器塊,明確結果。爲了處理有限的列表,Hammar的解決方案效率最低。 –

+0

@DanielFischer tnx添加此 –

回答

9

使用difference lists

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

感謝您添加此答案並向我介紹差異列表。通過問這個問題真的學到了一個新概念。 –

+3

'過濾器'甚至[1 ..]'。餵食無限列表時,'foldl' _never_可以產生任何東西。 –

3

如果您想保留列表的順序,那麼效率並不高。天真的做法是將其改爲foldl,然後顛倒結果列表。

2

想出了這樣一個:

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

這不是真的有效,因爲它在列表的末尾插入一個元素。

相關問題