gpt4 book ai didi

functional-programming - 标准 ML : Confusion about Reference Cells

转载 作者:行者123 更新时间:2023-12-04 17:46:47 28 4
gpt4 key购买 nike

我正在阅读 Harper 的 SML 简介,对引用单元格有点困惑。在页。 114,他举了以下例子:

val r = ref 0
val s = ref 0
val _ = r := 3
val x = !s + !r
val t = r
val _ = t := 5
val y = !s + !r
val z = !t !r

“执行这些绑定(bind)后,x 绑定(bind)到 3,y 绑定(bind)到 5,z 绑定(bind)到 10。”

这是我对他的代码的跟踪:
val r = ref 0 //allocates storage for r and sets to 0
val s = ref 0 //allocates storage for s and sets to 0
val _ = r := 3 //sets r = 3
val x = !s + !r //sets x = 0 + 3 = 3
val t = r //sets t = 3
val _ = t := 5 //sets t = 5
val y = !s + !r //sets y = 0 + 3 = 3
val z = !t !r //sets z = 5 + 3 = 8

我的 x 是正确的 (3),但我的 y 和 z 都是错误的(我的 y 是 3 而不是 5,我的 z 是 5 而不是 10)。

我在哪里错了?

另外,为什么是 val _ = t := 5必要而不是简单的 t := 5 ?

谢谢,
布莱曼

最佳答案

val t = r未设置 t为 3。它设置 tr 相同的引用单元格是。

因此,当您执行 t := 5 , 你设置了 t 的两个内容和 r到 5,因为两者都包含相同的引用单元格。

至于你的其他问题,t := 5是函数:= : 'a ref * 'a -> unit的函数调用.因此,t := 5是一个计算结果为 () 的表达式.
val _ = t := 5干脆扔掉()并将其转换为声明而不是表达式。

关于functional-programming - 标准 ML : Confusion about Reference Cells,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31501251/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com