OCaml中的不可变变量

cfi*_*her 4 ocaml

我正在学习OCaml,我对变量的不变性感到困惑.根据我正在阅读的书,变量是不可改变的.到目前为止一切都那么好,但为什么我可以这样做:

let foo = 42
let foo = 4242
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Leo*_*ite 9

我认为解释的最好方法是举个例子.考虑这段代码(在OCaml REPL中执行):

# let foo = 42;;
val foo : int = 42

# let return_foo () = foo;;
val return_foo : unit -> int = <fun>

# let foo = 24;;
val foo : int = 24

# return_foo ();;
- : int = 42
Run Code Online (Sandbox Code Playgroud)

上面的代码执行以下操作:

  1. 绑定42到名称foo.
  2. 创建一个return_foo ()返回绑定值的函数foo.
  3. 绑定24到名称foo(隐藏以前的绑定foo).
  4. 调用return_foo ()返回的函数42.

将此与可变值的行为(使用refOCaml中创建)进行比较:

# let foo = ref 42;;
val foo : int ref = {contents = 42}

# let return_foo () = !foo;;
val return_foo : unit -> int = <fun>

# foo := 24;;
- : unit = ()

# return_foo ();;
- : int = 24
Run Code Online (Sandbox Code Playgroud)

哪一个:

  1. 创建一个包含42并将其绑定到名称的可变引用foo.
  2. 创建一个函数return_foo (),该函数返回存储在绑定的引用中的值foo.
  3. 24参考商店中的商店foo.
  4. 调用return_foo ()返回的函数24.