2017-05-04 27 views
1

私は関数型プログラミングが初めてで、怠惰な評価がどのように機能しているのかを明確にしたいと思います。 (私は理解していること、しかし、それは決して実際に起こる)、メモリが不足するまで、最初のものは、すべての自然数のリストを取得し、遅延評価はどのように機能しますか?

nats = 0:(map (+1) nats) 
test = foldr (\x y-> if x > 2 then 0 else x+y) 10 nats 

そして、私の知る限り、と私は、次のような機能を持っています2番目のものはまさに何をすることになっていますか?テストでは、xとyを取得し、x> 2かつx + y elseの場合は2を返すラムダ計算関数の内部にありますが、x = 10であるため0を返すことになっていますか?私は少し混乱しています。その場合、ナットは本当に呼び出されていますか?

EDIT: テストは3を返しますが、今はどのように理解できないので本当に混乱しています。

ルーキーの間違いをしていると申し訳ありませんが、これがどう機能するのか理解できません。

+2

あなたは単に後方にそれを持っている: 'X'が使用され、nats' 'の要素の上の範囲、および '10'場合にのみ、最後のに使用されます'nats'が満たされます。これは、' 10'が決して使用されないことを意味します。 'foldr'は' 0+(1+(2+(0)) 'を計算します。ここで最後の0は' x = 3> 2'で 'if'を0にします。 – chi

答えて

5

たぶん、これらの減少はあなたを助ける:

let x `op` y = if x > 2 then 0 else x + y 

test          => 
foldr op 10 [0..]       => 
0 `op` foldr op 10 [1..]     => 
0 + foldr op 10 [1..]      => 
0 + (1 `op` foldr op 10 [2..])    => 
0 + (1 + foldr op 10 [2..])    => 
0 + (1 + (2 `op` foldr op 10 [3..]))  => 
0 + (1 + (2 + foldr op 10 [3..]))   => 
0 + (1 + (2 + (3 `op` foldr op 10 [4..]))) => 
0 + (1 + (2 + 0))       => 
0 + (1 + 2)        => 
0 + 3          => 
3 
+0

ありがとうございました私のために。 –

関連する問題