2017-01-28 7 views
3

評価の後、ここで「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 
+2

最近のStackOverflowに関する質問から、標準MLで教科書を読んでいると考えましたか?値バインディングのシャドーイング(変数を呼び出すのではなく)は、まともな教科書でまだ体系的にカバーされている、明白でないものの1つになります。あなたは[Working ProgrammerのためのML](https://www.amazon.co.uk/ML-Working-Programmer-Larry-Paulson/dp/052156543X)を考慮することができます。 –

答えて

1

あなたが見ていることは時々lexical scopingと呼ばれています。 fは、xの特定のバインディングの範囲で定義されていましたが、fが呼び出されたときに、fが何を行うかを理解する上で重要な範囲です。 xfが呼び出されるスコープ内で異なる意味を有するという事実は、f自身の意味に影響しません。関数型プログラミングの文脈では、他のものはreferential transparencyに違反します。そのような

val x = 1 

として結合の範囲内で自由に1によってxを交換することが可能であるべきです。このようfのあなたの定義は定義に同等次のようになります。

def f y = 1 + y 

として、確かに、それはあります。

2

私はそれを理解したと思います。ここに行く:

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