reference - 引用 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))
x
ref(7)
解决方案
更新 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。但这是否是“正确”的解决方案取决于您实际想要实现的目标。
推荐阅读
- google-cloud-platform - 如何在 Google Cloud Platform 上为多个虚拟机和项目共享单个云存储
- amazon-web-services - AWS S3 - 基于 Cognito 令牌管理权限
- virtualbox - 为 Virtual boxx 配置两个 IP
- amazon-web-services - .NET Core - AWS KMS - EncryptionMaterials 问题
- javascript - 为什么我不能使用第一个代码移动图片?
- apache-spark - Spark结构化流大文件
- javascript - ScrollReveal 与 webpack - ReferenceError: ScrollReveal 未定义
- environment-variables - 如何将谷歌凭证 json 放入 ENV 变量以进行生产?
- c# - 如何在不更改上次写入日期的情况下从 C# 代码中保存文件?
- php - 编辑:通过 PHP API 的 MikroTik IP 记帐仅存储在数据库中指定的信息