C++では、プログラムは関数に値ではなく参照を渡すことができます。OCamlには参照渡し機能がありますか?
void incrementInt(int &x)
{
++x;
}
OCamlはこの同じ機能を提供しますか?
C++では、プログラムは関数に値ではなく参照を渡すことができます。OCamlには参照渡し機能がありますか?
void incrementInt(int &x)
{
++x;
}
OCamlはこの同じ機能を提供しますか?
いいえ、それに相当するものはありません。
新たに割り当てられたメモリへのポインタのようなもので、オブジェクト参照によって渡される他の複合データ型のレコード、配列、オブジェクト、値があります。新しい割り当てられたメモリへのポインタ。
ただし、変数または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
関数は、セルの値をとり、それを増分することによって、新たな価値を創造し、 新しいの値がセルに挿入されます。それは任意の型の値を含めることができるように
私たちは、実際には、例えば、
type 'a cell = {
mutable value : 'a;
}
をタイプcell
をパラメータすることができ、ref
タイプは、実際には同じ(モジュロ名)を探します。これは標準ライブラリで次のように定義されています。
type 'a ref = {
mutable contents : 'a;
}
参照渡しの概念は、独自の抽象化をリークしたとパラメータが関数に渡されるかを理解するために、プログラマにそれが必要作られた言語で作成されました。 OCamlでは、これを悪夢として忘れることができます。 OCamlの各パラメータは1つのマシンワードしか取らず、レジスタを介して渡されるか、あまりにも多くのパラメータがある場合はスタック経由で渡されます。 Cプログラマーの観点からは、すべての値はスカラーまたはポインターです。整数と単項のコンストラクタ(バリアント)はスカラーとして渡され、複合データ型は常にポインタによって渡されます。
OCamlの変数に代入することは不可能であるため、OCamlでは値渡しと参照渡しが区別されません。たとえば、++x
はOCamlでは不可能です。
参照渡しと参照渡しの違いは、呼び出された関数の内部にパラメータが割り当てられている場合に発生します。つまり、渡される値は渡された変数には影響しません変数が渡された場合)。参照渡しでは、呼び出し元のスコープ内の渡された変数への代入と同じ効果があります。 OCamlでは、変数に代入することができないので、この区別は存在しません。 OCamlが「参照渡し」の場合、「渡し渡し」の場合とまったく同じように動作します。
可変データ構造への参照を渡して関数間で状態を共有することができますが、これは値渡しの言語でこれを行うことができるため、参照渡しとは何の関係もありませんCやJavaのように。
OCaml言語は、任意の値を渡すと常に可変部分を共有するような言語です。マニュアルhttp://caml.inria.fr/pub/docs/manual-ocaml/intfc.htmlの「OCamlとC言語のインタフェース」セクションで、OCaml値の内部表現について学ぶと便利です。 –