为什么此 SML 代码的计算结果为 7 而不是 6?
Why doe this SML code evaluate to 7 and not 6?
有人向我展示了此 SML 代码,作为内部绑定隐藏外部绑定的示例。
let val x = 1
in
(let val x=2 in x+1 end) + (let val y = x+2 in y+1 end)
end
在示例之后,作者写道,上面的代码计算结果为“7”,当我 运行 它时,我得到相同的结果:
: val it = 7 : int
我不明白为什么。如果 x“遮蔽”了外部绑定,那么在初始 let
中,它应该是 2
,对吗?所以函数应该是:
2 + 1
3
3 + 2 (x = 3, y = x + 2, so y = 3 + 2 = 5)
5
5 + 1 (y = 5, 5 + 1 = 6)
6
即使我误解了阴影的工作原理,最终结果应该是 5,而不是 6 也不是 7。所以这里发生了什么?
有时会发生这样的情况,写下问题最终会得到答案。
块应该被评估如下:
x = 2
x + 1
2 + 1
result: 3
result: 3 + ( y + 1), y = (x + 2) where x=1 (from above)
3 + ( 1 + 2) + 1
7
有人向我展示了此 SML 代码,作为内部绑定隐藏外部绑定的示例。
let val x = 1
in
(let val x=2 in x+1 end) + (let val y = x+2 in y+1 end)
end
在示例之后,作者写道,上面的代码计算结果为“7”,当我 运行 它时,我得到相同的结果:
: val it = 7 : int
我不明白为什么。如果 x“遮蔽”了外部绑定,那么在初始 let
中,它应该是 2
,对吗?所以函数应该是:
2 + 1
3
3 + 2 (x = 3, y = x + 2, so y = 3 + 2 = 5)
5
5 + 1 (y = 5, 5 + 1 = 6)
6
即使我误解了阴影的工作原理,最终结果应该是 5,而不是 6 也不是 7。所以这里发生了什么?
有时会发生这样的情况,写下问题最终会得到答案。
块应该被评估如下:
x = 2
x + 1
2 + 1
result: 3
result: 3 + ( y + 1), y = (x + 2) where x=1 (from above)
3 + ( 1 + 2) + 1
7