SML 中绑定的价值?
Value of bindings in SML?
有人可以解释一下为什么 "ans" 在评估后绑定到 16 的值 - 这是正确的答案吗?
我认为答案是 3,因为我们正在调用函数 f 并发送值 1 和 2,因为函数 f 也看不到值 5 和 10,但我想我错了。
val x = 1
val y = 2
val f = fn y => x + y
val x = 5
val y = 10
val ans = f x + y
我想我明白了。这里是:
函数 f
直到最后才被计算。所以在:
val ans = f x + y
... 调用函数 f
时使用最近的值 x
,即 5
,因为前一个 x
的值被隐藏了。所以在:
val f = fn y => x + y
...收到的值成为y
的值。这里函数 f
取前一个 x
的值,即 1
,因此总共 6
(x
来自静态环境)。那么:
val ans = f x + y
我们回到这里:6 + 10 = 16
您看到的有时称为词法范围。函数 f
是在 x
的某个绑定范围内定义的,该范围是理解调用 f
时 f
做什么的唯一重要范围。 x
在调用 f
的范围内具有不同含义这一事实不会影响 f
本身的含义。在函数式编程的上下文中,任何其他内容都会违反 referential transparency。在一个绑定的范围内如
val x = 1
应该可以用1
自由替换x
。因此,您对 f
的定义应该 等同于 定义:
def f y = 1 + y
确实如此。
有人可以解释一下为什么 "ans" 在评估后绑定到 16 的值 - 这是正确的答案吗?
我认为答案是 3,因为我们正在调用函数 f 并发送值 1 和 2,因为函数 f 也看不到值 5 和 10,但我想我错了。
val x = 1
val y = 2
val f = fn y => x + y
val x = 5
val y = 10
val ans = f x + y
我想我明白了。这里是:
函数 f
直到最后才被计算。所以在:
val ans = f x + y
... 调用函数 f
时使用最近的值 x
,即 5
,因为前一个 x
的值被隐藏了。所以在:
val f = fn y => x + y
...收到的值成为y
的值。这里函数 f
取前一个 x
的值,即 1
,因此总共 6
(x
来自静态环境)。那么:
val ans = f x + y
我们回到这里:6 + 10 = 16
您看到的有时称为词法范围。函数 f
是在 x
的某个绑定范围内定义的,该范围是理解调用 f
时 f
做什么的唯一重要范围。 x
在调用 f
的范围内具有不同含义这一事实不会影响 f
本身的含义。在函数式编程的上下文中,任何其他内容都会违反 referential transparency。在一个绑定的范围内如
val x = 1
应该可以用1
自由替换x
。因此,您对 f
的定义应该 等同于 定义:
def f y = 1 + y
确实如此。