Ваш способ сформулировать вопрос предполагает, что вы думаете с точки зрения переменных .SML на самом деле не имеет переменных так же, как в языке, подобном Java, переменные.Он имеет значения , которые могут быть с именем .В val x = 2
значение 2
связано с именем x
.На данный момент нет реального различия между x
и 2
.Это связано с тем, что SML является функциональным языком, который обеспечивает ссылочную прозрачность , где в любом выражении переменная может быть заменена ее значением без изменения значения выражения.Таким образом, в
fun f (z,w) = x + z + w
x
можно заменить на 2
без изменения значения выражения.Следовательно, это определение эквивалентно
fun f (z,w) = 2 + z + w
Позже ваш код создает новое значение 4 и (юридически, хотя и несколько непоследовательно) также именует это новое значение x
.Это создает совершенно новую привязку.Вы не изменили x
- вы уничтожили (или по крайней мере навсегда скрыли) старый x
и создали новый.Этот новый x
- это то, что используется в последнем вызове функции.Значения x,z
находятся в этой точке в коде 4,3
соответственно, следовательно, по ссылочной прозрачности
f(z,w) = f(3,4) = 2 + 3 + 4 = 9