可变函数输出
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
是一个对象,它有两个可变字段 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
如您所见,名称绑定只是名称竞标,因此它不会创建新对象或类似的东西。
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
是一个对象,它有两个可变字段 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
如您所见,名称绑定只是名称竞标,因此它不会创建新对象或类似的东西。