2017-01-28 15 views
3

может кто-нибудь объяснить, почему «ans» обязан оценивать значение 16 здесь после оценки - это правильный ответ?Значение привязок в SML?

Я думал, что ответ 3, так как мы вызываем функцию f и отправляем значения 1 и 2, поскольку функция f также не видит значения 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? Тень привязки значений (а не вызов их переменных) была бы одной из тех неочевидных вещей, которые по-прежнему систематически охватываются в любом достойном учебнике. Вы можете рассмотреть [ML для рабочего программиста] (https://www.amazon.co.uk/ML-Working-Programmer-Larry-Paulson/dp/052156543X). –

ответ

1

То, что вы видите, иногда называют lexical scoping. Функция f была определена в области определенной привязки для x, эта область является единственной областью, которая имеет значение для понимания того, что делает f при вызове f. Тот факт, что x имеет другое значение в области, в которой вызывается f, не влияет на значение самого f. В контексте функционального программирования все остальное будет нарушать referential transparency. В рамках привязки, такие как

val x = 1 

должна быть возможность свободно заменить x на 1. Таким образом, ваше определение f должно быть эквивалентно определению:

def f y = 1 + y 

как, впрочем, оно и есть.

2

Я думаю, что понял. Здесь:

fn f не оценивается до конца. Таким образом, на:

Валу ANS = F х + у

п е вызывается с недавним значением х, который является 5, так как значение предыдущего х следят. Таким образом, на:

Валу F = п у => х + у

значение, полученное становится значением у. и здесь функция f принимает значение предыдущего x, которое равно 1, так что это всего 6 (x происходит из статической среды). Тогда:

вал анс = е х + у

мы вернемся сюда: 6 + 10 = 16