Как предполагает Андреас Россберг, val f = fn r => !r := 7
может быть одним из способов обновления int int ref ref до 7. Но вместо 7
вы можете написать что угодно.Если вместо этого вы хотите увеличить в два раза значение int , на которое косвенно указывает гибрид, между вашей попыткой и предложением Андреаса может быть
fun f r = !r := !(!r) + 2
Здесь !r := ...
означает«разыменование r
для получения int ref , на которое он указывает, и обновление этого int ref так, чтобы оно вместо этого указывало на ...
», а !(!r) + 2
означает «разыменование r
дважды, чтобы получить int , на который он косвенно указывает, и добавить два к нему. "На данный момент вы не изменили то, на что указывает r
(как вы делаете с s := ref ...
), и вы используете значение, на которое оно указывает косвенно, с помощью двойной разыменования !(!r)
.
Тестовая программа для этого может быть:
val x = ref 5
val y = ref x
fun f r = !r := !(!r) + 2
fun debug str =
print ( str ^ ": x points to " ^ Int.toString (!x) ^ " and "
^ "y points indirectly to " ^ Int.toString (!(!y)) ^ ".\n" )
val _ = debug "before"
val _ = f y
val _ = debug "after"
Запуск этой тестовой программы дает:
before: x points to 5 and y points indirectly to 5.
after: x points to 7 and y points indirectly to 7.