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

时间:2015-07-09 03:49:00

标签: variables reference ocaml

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

在Ocaml交互式会话中玩,似乎let-bindings和references在语法上有一些不同之处。如果我使用let-binding将变量名设置为某个整数值,该名称将返回该值,直到我解除它或将名称重置为另一个整数,let-binding将允许。这适用于floatstring# 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 ,但尚未尝试其他类型。我错过了什么?

$scope.sentence

2 个答案:

答案 0 :(得分: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
#

在此会话中,有两个不同的 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

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

答案 1 :(得分:2)

我看待它的方式,let定义了一个变量,OCaml中的所有变量都是不可修改的 - 根本没有分配给变量的语法。

某些变量是指向复合数据结构的指针,并且某些数据结构是可变的(包括具有mutable字段的数组,字符串和记录/对象)。 A&#34;引用&#34;,一个可变单元,是最简单的可变数据结构,标准库中的Pervasives中已经提供了运算符用于处理它;但它与其他可变数据结构没有什么不同。

类比,如果您使用的是Java,并且所有变量始终为final。您有一个数据结构Ref<T>,您可以使用new Ref<Integer>(...)分配该数据结构以获取对此对象的引用,并且您可以使用.get().set()访问其单个数据等等,您可以将对此数据结构的引用分配给其他变量,以便您可以跨引用共享对此数据结构的更改。 OCaml中的ref也发生了同样的事情 - 您使用ref ...分配它以获取引用,然后使用!<-访问其单个数据,您可以将引用分配给其他变量,以便跨引用共享相同数据结构的视图。