可变函数输出

Mutability Function Output

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 "sometimes"。我想这与 dot1 和 dot2 是否是别名有关,但我仍然不明白为什么这很重要,因为我们只是修改 dot1 并访问 dot1 的 x 字段。

尝试运行

let dot = {x=0; y=0;};;
f dot dot;;

这是一个简单的例子,当返回值是 26 而不是 12:

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

# f p p;;
- : int = 26

这里 p 是一个对象,它有两个可变字段 xy。应用时,函数 f 获得与 dot1dot2 相同的对象,因此,名称 dot1dot2 都指代相同的对象,无论您使用的是哪个名称,它将导致 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

如您所见,名称绑定只是名称竞标,因此它不会创建新对象或类似的东西。