誰かが私にこの5に等しい理由を説明することはできますか?どうしてですか?fst(x + 1、(5、x-2)))))))))))))))))))))))))で)xのx = 3をしましょう5
let x = x+3 in fst (snd (x+1,(5,x-2)))
誰かが私にこの5に等しい理由を説明することはできますか?どうしてですか?fst(x + 1、(5、x-2)))))))))))))))))))))))))で)xのx = 3をしましょう5
let x = x+3 in fst (snd (x+1,(5,x-2)))
snd(x+1,(5,x-2))
その後、fst(5,x-2)
が5
に等しく、(5,x-2)
に等しいです。これらのすべては、x
を含む式の評価を必要としません(Haskellは怠惰です、必要なときだけ物事を評価することを意味します)。
のは、今のlet x = x + 3 in
部分を無視してin
後に来るものに焦点を当ててみましょう:
fst (snd (x + 1, (5, x - 2)))
fst
とsnd
の定義はそう括弧で最初
fst (a, b) = a
snd (a, b) = b
された状態で
snd (x + 1, (5, x - 2)) ==> (5, x - 2)
は今、これはfst
に渡されます:
fst (5, x - 2) ==> 5
だから、最後にx
の値が実際に重要ではありません。
これは、レイジー評価と呼ばれるもののためにハスケルで発生する可能性があります。本質的に、コンパイラは必要になるまで値を解決しません。あなたがx
を印刷しようとした場合は、これを評価しようとしているメモリを使い果たしたときに定義
x = x + 3
を使用すると、いくつかの点で無限ループと、おそらくエラーになるだろう。 x
の値は決して実際には出力されないので、コンパイラは自由にその値を解決できます。 REPLの式を評価するときにコンソールに出力される値は5です。x
の値に依存しないため、x
は安全に無視できます。
怠惰なプログラミングを再生するには出番のもう一つの例は、式
> let ones = 1:ones in take 5 ones
[1,1,1,1,1]
定義let ones = 1:ones
は1Sの無限のリストを定義しているが、我々は唯一のtake 5 ones
でそれらの5をつかむために、この式はすることができます解決する。
あなたはそれが同じであるべきと思います、なぜですか? –
これを段階的に計算するには、まず 'snd(a、b)'を 'b'に置き換えてください... – chi
それは他の何かと等しくないのか、それともエラーを生じないのか尋ねていますか? – sepp2k