0
爲什麼計算下面的表達式終止?也許是退出fold
foldr (\x t -> if x > 5 then Just x else t) Nothing $ [1..]
有什麼特別之處Maybe
(或它實現的類型等級之一),導致評價停止拉姆達返回Just
後?
爲什麼計算下面的表達式終止?也許是退出fold
foldr (\x t -> if x > 5 then Just x else t) Nothing $ [1..]
有什麼特別之處Maybe
(或它實現的類型等級之一),導致評價停止拉姆達返回Just
後?
Maybe
,Just
和Nothing
在此處不起作用。我們看到的只是工作上的懶惰。事實上,對於任何(總)函數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
,並且不再進行遞歸調用。
關鍵在於賦予'foldr'的函數在其第二個參數中是非嚴格的。 –