0
次の式の計算が終了するのはなぜですか?折り畳まれていない可能性があります。
foldr (\x t -> if x > 5 then Just x else t) Nothing $ [1..]
ラムダはJust
を返した後に停止するための評価を起こしMaybe
(またはそれが実装型クラスの1)について何か特別なことはありますか?
次の式の計算が終了するのはなぜですか?折り畳まれていない可能性があります。
foldr (\x t -> if x > 5 then Just x else t) Nothing $ [1..]
ラムダはJust
を返した後に停止するための評価を起こしMaybe
(またはそれが実装型クラスの1)について何か特別なことはありますか?
Maybe
,、およびNothing
はここでは重要な役割を果たしません。私たちが見ているのは、仕事場での怠惰なことです。実際に、任意の(合計)関数f
と値a
ため、これも終了することになる:これは、foo [1..]
と呼ばれる普通再帰
foo [] = a
foo (x:xs) = if x > 5 then f x else foo xs
と完全に等価である
foldr (\x t -> if x > 5 then f x else t) a $ [1..]
。最終的にx
は6
となり、f 6
が返され、それ以上の再帰呼び出しは行われません。
キーは、 'foldr'に与えられた関数が第2引数で厳密でないことです。 –