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