OCaml中let-bindings和references之间有什么区别?

and*_*ter 6 variables ocaml reference

OCaml教程说,引用是"实际变量",您可以在整个程序中分配和更改它们.让绑定不起作用.在这个链接中,它表示当通过let-binding设置名称时,你不能"......重新分配它指向不同的小部件".我知道引用实际上存储在内存中,并且let-bindings不是,但我不明白他们对赋值的说法.

在Ocaml交互式会话中玩游戏,似乎let-bindings和引用在语法上有一些不同之处.如果我使用let-binding将变量名设置为某个整数值,该名称将返回该值,直到我解除它或将名称重置为另一个整数,let-binding将允许.对于ints,floats和strings 都是如此,但是没有尝试过其他类型.我错过了什么?

# let let_var = 2;;
val let_var : int = 2
# let_var;;
- : int = 2
# let let_var = 3;;
val let_var : int = 3
# let_var;;
- : int = 3
Run Code Online (Sandbox Code Playgroud)

Jef*_*eld 10

看待事物的最好方法是,让绑定是一种为某些东西赋予永久名称的方式.由于OCaml的范围规则允许您重用名称,因此可以在内部上下文中为其他内容指定相同的名称.但在某种意义上,名字仍然存在,并且仍然与其永久价值相关联.

这是一个可能有助于说明这一点的会话:

$ ocaml
        OCaml version 4.02.1

# let v = 12;;
val v : int = 12
# let g x = v + x;;
val g : int -> int = <fun>
# g 10;;
- : int = 22
# let v = 200;;
val v : int = 200
# g 10;;
- : int = 22
#
Run Code Online (Sandbox Code Playgroud)

在此会话中,有两个不同的 let绑定具有相同的名称v.该功能g使用第一个.如果您创建一个名为的新绑定v,则不会更改任何内容g.

另一方面,参考是一个值.它根本不是一个名字,它是一种可变的价值; 即,它拥有另一个可以改变的值.以下会话可能有助于说明这一点:

# let myref = ref 12;;
val myref : int ref = {contents = 12}
# let h x = !myref + x;;
val h : int -> int = <fun>
# h 10;;
- : int = 22
# myref := 200;;
- : unit = ()
# h 10;;
- : int = 210
Run Code Online (Sandbox Code Playgroud)

myref是一个let-bound变量,它(永久地)引用一个作为引用的值.最初,引用保持值12.但值可以更改.该函数h使用参考中存储的当前值.但请注意(再次)myref没有改变.它仍然(永久地)与相同的参考相关联.