Processing math: 100%

2017年7月27日 星期四

Haskell中用foldl實現foldr

假設折疊中的折疊函數是f(x,y),要折疊[1,2,3],初始值是0
左折疊的精神如下:
f(f(f(0,1),2),3)
遞迴呼叫是發生在左邊的參數。
參數求值是從左到右的。因為一定要先遞迴到最深才能取得參數值,所以不能使用在無窮串列上。

右折疊的精神如下:
f(1,f(2,f(3,0)))
遞迴呼叫是發生在右邊的參數。
可以發現不用遞迴到最深就能取得參數,所以可以使用在無窮串列上。

用左折疊實現右折疊的方法就是,讓折疊函數回傳一個函數,折疊的結果是接收一個參數的函數,這樣就可以改變遞迴的位置了。

程式碼如下:
foldr' :: (b -> a -> a) -> a -> [b] -> a
foldr' f a bs = foldl (\g b x -> g (f b x)) id bs a


沒有留言: