首页 > 解决方案 > 引用 SML 中的引用

问题描述

我正在研究 SML 中的参考文献。

我写了以下代码:

let
    val f = (fn (s) => s := ref((!(!s)) + 2))
    val x = ref (5)
    val y = ref x
in
    (f y ; !x)
end;

尽管我val it = 7 : int的程序打印了val it = 5 : int. 我不明白为什么。我确定问题出在f函数中,但不明白为什么。

我正在尝试做的事情:函数f应该将参数y更新为. 但由于某种原因它不起作用。问题是什么?ref(ref(7))xref(7)

标签: referencesml

解决方案


更新 y 以指向新的 ref 不会更新 x。在调用 f 期间创建了一个新引用,我们称之为 z。在通话之前,我们有:

x -> 5
y -> x

->“指向”在哪里。调用后是:

x -> 5
y -> z
z -> 7

编辑:实际更新 x 的一种可能方法是定义 f 如下:

val f = fn r => !r := 7

当调用 fy 时,这会更新y指向的引用,即 x。但这是否是“正确”的解决方案取决于您实际想要实现的目标。


推荐阅读