OCaml 有引用传递的能力吗?

Does OCaml have the ability to pass by reference?

在 C++ 中,程序可以将引用而不是值传递给函数。

void incrementInt(int &x) 
{
  ++x;
}

OCaml 是否提供相同的功能?

不,没有严格的等价物。

refs,就像指向新分配的内存的指针,还有记录,数组,对象和其他复合数据类型的值,被传递"by object reference",这再次意味着它们就像指向新分配内存的指针。

但是,没有与指向变量或 C++ 引用的指针等效的东西。

最接近的可能是:

let x=ref 3;;        
let incrementInt x = 
  x := !x+1;;

incrementInt x;;
# !x;;
- : int = 4

sepp2k说的不一样

在OCaml中,参数是按值传递的。一个值本身可以是可变的,也可以是不可变的。前者可以被被调用者修改,调用者可以看到。不可变值,显然,不能修改。值的可变性由其类型定义。 OCaml 中的大多数值类型都是不可变的。值得注意的例外是数组和字符串(在较新版本的 OCaml 中,字符串变得不可变,但让我们跳过这个主题)。例如,int 类型的值是不可变的。这是很自然的——如果你有数字 5,它总是数字 5,你不能改变它。但是,您可以将此数字放入可变单元格并将此单元格传递给函数。这样的函数,可以改变单元格的内容。请注意,我们并没有改变数字本身,我们只是将另一个数字放入同一个单元格中,例如,

type cell = {
  mutable value : int;
}

let incr x = 
   x.value <- x.value + 1

incr 函数从单元格中获取一个值,通过递增它创建一个新值,然后将 new 值放入单元格中。

我们可以参数化类型cell,这样它就可以包含任何类型的值,例如

type 'a cell = {
    mutable value : 'a;
}

事实上,ref 类型实际上看起来是一样的(取模名称)。在标准库中定义如下;

type 'a ref = {
  mutable contents : 'a;
}

通过引用传递的概念是由泄露自身抽象的语言创建的,这使得程序员有必要了解参数是如何传递给函数的。在 OCaml 中,您可以将其视为一场噩梦。 OCaml 中的每个参数只需要一个机器字,并通过寄存器传递,如果参数太多,则通过堆栈传递。从 C 程序员的角度来看,每个值都是标量或指针。整数和一元构造函数(变体)作为标量传递,其中复合数据类型始终通过指针传递。

在 OCaml 中按值传递和按引用传递之间没有明显的区别,因为在 OCaml 中不可能给变量赋值。例如,您的 ++x 在 OCaml 中是不可能的。

按值传递和按引用传递之间的区别在于当参数被分配给被调用函数内部时会发生什么 -- 在按值传递中,它对传递的变量没有影响(如果传递了变量);在按引用传递中,它与在调用范围内对传递的变量赋值具有相同的效果。在 OCaml 中,你不能赋值给一个变量,所以这个区别不存在。如果 OCaml 是 "pass-by-reference",它的工作方式将与 "pass-by-value".

完全相同

您可以传递对可变数据结构的引用,并使用它在函数之间共享状态,但这与按引用传递无关,因为您可以在仅按值传递中执行此操作C 和 Java.

等语言