OCaml是否有能力通过引用传递?

时间:2016-10-12 16:57:15

标签: c++ ocaml pass-by-reference

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

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

OCaml是否提供相同的功能?

4 个答案:

答案 0 :(得分:8)

不,没有严格的等价物。

ref个,类似于新分配内存的指针,还有其他复合数据类型的记录,数组,对象和值,通过对象引用传递#34;#34} ;,这再次意味着它们就像指向新分配的内存一样。

但是,没有相当于指向变量或C ++引用的指针。

答案 1 :(得分:3)

在OCaml中,pass-by-value和pass-by-reference之间没有可区别的区别,因为它不可能分配给OCaml中的变量。例如,在OCaml中您的++x是不可能的。

pass-by-value和pass-by-reference之间的区别在于将参数分配给被调用函数内部时发生的情况 - 在按值传递时,它对传递的变量没有影响(如果传递了一个变量);在pass-by-reference中,它与赋值给调用范围中的传递变量具有相同的效果。在OCaml中,您无法分配给变量,因此不存在这种区别。如果OCaml是"传递引用",它的工作方式与"按值传递"完全相同。

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

答案 2 :(得分:2)

在OCaml中,参数按值传递。值本身可以是可变的,也可以是不可变的。前者可以被被调用者修改,并且调用者可以看到它。显然,不可变的值不能被修改。值的可变性由其类型定义。 OCaml中的大多数值类型都是不可变的。值得注意的例外是数组和字符串(在较新版本的OCaml stings中变得不可变,但让我们跳过这个主题)。例如,类型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程序员的角度来看,每个值都是标量或指针。整数和一元构造函数(变体)作为标量传递,其中复合数据类型始终由指针传递。

答案 3 :(得分:0)

最近的,可能是:

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

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

正如所说的sepp2k,它不一样。