2017-06-05 15 views
0

次の式の計算が終了するのはなぜですか?折り畳まれていない可能性があります。

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

ラムダはJustを返した後に停止するための評価を起こしMaybe(またはそれが実装型クラスの1)について何か特別なことはありますか?

答えて

4

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..] 

。最終的にx6となり、f 6が返され、それ以上の再帰呼び出しは行われません。

+0

キーは、 'foldr'に与えられた関数が第2引数で厳密でないことです。 –

関連する問題