Выходной сигнал функции изменчивости - PullRequest
0 голосов
/ 14 октября 2019
type dot = {mutable x:int; mutable y:int} 

let f (dot1:dot) (dot2:dot) : int = 

dot1.x <- 12;
dot2.x <- 26;
dot1.x

Я не уверен, к чему это приведет. Я предполагаю, что он будет оценивать до 12 всегда, но ключ ответа говорит, что он оценивает только до 12 «иногда». Я предполагаю, что это связано с тем, являются ли dot1 и dot2 псевдонимами, но я все еще не понимаю, почему это будет иметь значение, учитывая, что мы модифицируем только dot1 и обращаемся к полю x точки 1.

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Вот простой пример, когда возвращаемое значение будет 26, а не 12:

# let p = {x=0; y=0};;
val p : dot = {x = 0; y = 0}

# f p p;;
- : int = 26

Здесь p - это объект, который имеет два изменяемых поля x и y. При применении функция f получает тот же объект, что и dot1 и dot2, поэтому оба имени dot1 и dot2 относятся к одному и тому же объекту и, независимо от того, какое имя вы используете, приведутна модификацию объекта p.

Другой пример, который не включает в себя какие-либо функции, а только let связанные имена,

# let p1 = p;;
val p1 : dot = {x = 26; y = 0}
# let p2 = p;;
val p2 : dot = {x = 26; y = 0}
# p1.y <- 1;;
- : unit = ()
# p;;
- : dot = {x = 26; y = 1}
# p2.x <- 11;;
- : unit = ()
# p;;
- : dot = {x = 11; y = 1

Как вы можете видеть, привязка имени - это просто привязка имени, поэтому она несоздание нового объекта или чего-то подобного.

1 голос
/ 14 октября 2019

Попробуйте запустить

let dot = {x=0; y=0;};;
f dot dot;;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...