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

时间:2019-05-25 03:20:48

标签: ocaml

在研究OCaml时,我发现我确定会抛出异常,但返回的值是1。

  let x = 1 in 
  let f y = x in 
  let x = 2 in 
  f 0;;

如果我依次考虑,好的,x取值为1。然后,在较低的上下文中,我们说f y = x。由于未定义y,因此我认为编译器应该在此处引发异常。即使定义了y,如果它像Haskell这样的绑架行为,我也认为这可能会“在f处定义y。但是我不希望它为其他值定义f

所以我似乎对此工作有点困惑。

1 个答案:

答案 0 :(得分:2)

OCaml中的变量不会更改值,它们是不可变的。您的代码定义了两个名为x不同事物。函数f始终使用第一个定义。当您定义具有相同名称的新值时,这对f无效。

您说let f y = x是在定义 y,而不是指先前的y。您为y的参数赋予名称f,然后可以在f的定义中使用它(尽管您的代码选择不使用y,很好)。