Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables OCaml中的let绑定和引用之间有什么区别?_Variables_Reference_Ocaml - Fatal编程技术网

Variables OCaml中的let绑定和引用之间有什么区别?

Variables OCaml中的let绑定和引用之间有什么区别?,variables,reference,ocaml,Variables,Reference,Ocaml,OCaml教程说,引用是“真实变量”,可以在整个程序中分配和更改。让绑定不起同样的作用。在本文中,它表示当一个名称由let绑定设置时,您不能“…重新分配它以指向另一个小部件。”我知道引用实际上存储在内存中,而let绑定不是,但我不理解它们对分配的说法 在Ocaml交互会话中,似乎让绑定和引用做相同的事情,但语法上有所不同。如果我使用let绑定将变量名设置为某个整数值,则该名称将返回该值,直到我取消设置该变量名或将该名称重置为let绑定允许的其他整数为止。这适用于ints、floats和strin

OCaml教程说,引用是“真实变量”,可以在整个程序中分配和更改。让绑定不起同样的作用。在本文中,它表示当一个名称由let绑定设置时,您不能“…重新分配它以指向另一个小部件。”我知道引用实际上存储在内存中,而let绑定不是,但我不理解它们对分配的说法

在Ocaml交互会话中,似乎让绑定和引用做相同的事情,但语法上有所不同。如果我使用let绑定将变量名设置为某个整数值,则该名称将返回该值,直到我取消设置该变量名或将该名称重置为let绑定允许的其他整数为止。这适用于
int
s、
float
s和
string
s,但未尝试其他类型。我错过了什么

# 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

看待事物的最佳方式是,let绑定是一种为某事物赋予永久名称的方式。由于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 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绑定变量,它(永久)引用一个作为引用的值。最初,引用保存值12。但是这个值是可以改变的。函数
h
使用存储在引用中的当前值。但请(再次)注意,
myref
没有改变。它仍然(永久地)与同一引用关联。

在我看来,
定义一个变量,OCaml中的所有变量都是不可修改的——根本没有语法可分配给变量

有些变量是指向复合数据结构的指针,有些数据结构是可变的(包括数组、字符串和带有
mutable
字段的记录/对象)。“reference”是一个可变单元,是最简单的可变数据结构,标准库中的
pervisives
中已经提供了用于使用它的运算符;但它与其他可变数据结构没有什么不同


打个比方,就像在Java中一样,所有变量总是
final
。您有一个数据结构
Ref
,您可以使用
new Ref(…)
分配该结构以获取对该对象的引用,并且您可以使用
.get()
.set()
,访问其单个数据段,您可以将此数据结构的引用分配给其他变量,以便跨引用共享对此数据结构的更改。OCaml中的
ref
也发生了同样的事情——您使用
ref…
分配它以获取引用,然后使用
访问它的单个数据段
在FP和数学意义上,引用不是实变量。请注意,在内存中分配REF并不是不可避免的:编译器可以将非跳过REF提升到寄存器中。