2017-06-05 17 views
0

爲什麼計算下面的表達式終止?也許是退出fold

foldr (\x t -> if x > 5 then Just x else t) Nothing $ [1..] 

有什麼特別之處Maybe(或它實現的類型等級之一),導致評價停止拉姆達返回Just後?

回答

4

Maybe,JustNothing在此處不起作用。我們看到的只是工作上的懶惰。事實上,對於任何(總)函數f和價值a,這也將終止:

foldr (\x t -> if x > 5 then f x else t) a $ [1..] 

這是完全等同於普通遞歸

foo [] = a 
foo (x:xs) = if x > 5 then f x else foo xs 

時稱爲foo [1..]。最後,x變爲6,返回f 6,並且不再進行遞歸調用。

+0

關鍵在於賦予'foldr'的函數在其第二個參數中是非嚴格的。 –