評価の後、ここで「ans」が16の値にバインドされている理由を説明していただけますか?これは正解ですか?SMLのバインディングの値は?
私は関数fを呼び出しているので、答え3と考えていました。関数fとして値1と2を送ると値5と10も見えませんが、間違っていると思います。
val x = 1
val y = 2
val f = fn y => x + y
val x = 5
val y = 10
val ans = f x + y
評価の後、ここで「ans」が16の値にバインドされている理由を説明していただけますか?これは正解ですか?SMLのバインディングの値は?
私は関数fを呼び出しているので、答え3と考えていました。関数fとして値1と2を送ると値5と10も見えませんが、間違っていると思います。
val x = 1
val y = 2
val f = fn y => x + y
val x = 5
val y = 10
val ans = f x + y
あなたが見ていることは時々lexical scoping
と呼ばれています。 f
は、x
の特定のバインディングの範囲で定義されていましたが、f
が呼び出されたときに、f
が何を行うかを理解する上で重要な範囲です。 x
がf
が呼び出されるスコープ内で異なる意味を有するという事実は、f
自身の意味に影響しません。関数型プログラミングの文脈では、他のものはreferential transparencyに違反します。そのような
val x = 1
として結合の範囲内で自由に1
によってx
を交換することが可能であるべきです。このようf
のあなたの定義は定義に同等次のようになります。
def f y = 1 + y
として、確かに、それはあります。
私はそれを理解したと思います。ここに行く:
fn fは最後まで評価されません。そうで:ヴァル
ANS = FのX + Y
FN fは前xの値がシャドウされているので、5最近の値xと呼び出されます。そうで:
ヴァル・F = FNのY => X + Y
受信された値は、yの値となります。ここでは関数fは前のxの値を1にして1になりますので、合計は6です(xは静的環境に由来します)。その後:
ヴァルANS = FのX + Y
は、私たちはここに戻って取得します:6 + 10 = 16
最近のStackOverflowに関する質問から、標準MLで教科書を読んでいると考えましたか?値バインディングのシャドーイング(変数を呼び出すのではなく)は、まともな教科書でまだ体系的にカバーされている、明白でないものの1つになります。あなたは[Working ProgrammerのためのML](https://www.amazon.co.uk/ML-Working-Programmer-Larry-Paulson/dp/052156543X)を考慮することができます。 –