在研究ocaml时,我发现这段代码肯定会引发异常,但它返回值1。
let x = 1 in let f y = x in let x = 2 in f 0;;
如果我按顺序考虑,好的, x 取值1。然后在较低的上下文中,我们说 f y = x . 自从 y 没有定义,我想编译器应该在这里抛出一个异常。即使 Y 被定义了,我想这可能会“定义 f 在 Y “如果它像哈斯克尔一样绑架。但我不希望它能定义 f 其他值。
x
f y = x
y
Y
f
所以我似乎有点困惑这是如何工作的。
OCAML中的变量不会改变值,它们是不可变的。你的代码定义了两个 不同的 物名 x . 函数 f 始终使用第一个定义。当您定义一个同名的新值时,这对 f .
当你说 let f y = x 你是 定义 y ,不指以前的 Y . 你说的是名字 Y 到的参数 f ,然后可用于定义 f (尽管您的代码选择不使用 Y 很好)。
let f y = x