В sml вопрос о сфере применения неоднозначен - PullRequest
0 голосов
/ 29 сентября 2018
val x = 2
fun f (z,w) = x + z + w
val z = 3
val x = 4
val ans = f(z,x)

почему значение ans равно 9?В f я думаю, что значение x обозначено как 2, так как val x объявлен, а x не объявлен, когда дело доходит до удовольствия f (z, w) Прав ли я ??

1 Ответ

0 голосов
/ 29 сентября 2018

Ваш способ сформулировать вопрос предполагает, что вы думаете с точки зрения переменных .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
...