OCaml:为什么在未定义变量的情况下进行编译?

OCaml:为什么在未定义变量的情况下进行编译?,ocaml,Ocaml,在研究OCaml时,我发现这段代码肯定会引发异常,但它返回的值为1 let x = 1 in let f y = x in let x = 2 in f 0;; 如果我按顺序考虑,那么,x取值1。然后在较低的上下文中,我们说fy=x。由于没有定义y,我认为编译器应该在这里抛出一个异常。即使定义了y,我想如果它像哈斯克尔一样起作用,它可能会“定义faty”。但我不希望它为其他值定义f 所以我似乎对它的工作原理有点困惑。OCaml中的变量不会改变值,它们是不可变的。您的代码定

在研究OCaml时,我发现这段代码肯定会引发异常,但它返回的值为1

  let x = 1 in 
  let f y = x in 
  let x = 2 in 
  f 0;;
如果我按顺序考虑,那么,
x
取值1。然后在较低的上下文中,我们说
fy=x
。由于没有定义
y
,我认为编译器应该在这里抛出一个异常。即使定义了
y
,我想如果它像哈斯克尔一样起作用,它可能会“定义
f
at
y
”。但我不希望它为其他值定义
f


所以我似乎对它的工作原理有点困惑。

OCaml中的变量不会改变值,它们是不可变的。您的代码定义了两个不同的名称
x
。函数
f
始终使用第一个定义。使用相同名称定义新值时,这对
f
没有影响


当你说
让fy=x
时,你是在定义
y
,而不是指以前的
y
。您将
y
命名为
f
的参数,然后可以在
f
的定义中使用该参数(尽管您的代码选择不使用
y
,这很好)。

OCaml中的变量不改变值,它们是不可变的。您的代码定义了两个不同的名称
x
。函数
f
始终使用第一个定义。使用相同名称定义新值时,这对
f
没有影响


当你说
让fy=x
时,你是在定义
y
,而不是指以前的
y
。你给
f
的参数命名为
y
,然后可以用在
f
的定义中(虽然你的代码选择不使用
y
,这很好)。

哦,如果我理解正确,那行基本上说“
f
在任何输入上都是
x
(这是1)。”,所以如果我理解正确,那行基本上说“
f
在任何输入上都是
x
(即1)。”