web-dev-qa-db-ja.com

ocamlの「等しい(=)」と「同一(==)」の違いは何ですか?

OCamlには、2種類の_equity comparisons_があります。

_x = y_および_x == y_、

それで、それらの間の正確な違いは何ですか?

Javaのx.equals(y)と同じようにocamlの_x = y_ですか?

そして、Javaのx == y (comparing the address)と同じように_x == y_ですか?

27
Jackson Tale

Javaでx.equals(y)がどのように機能するか正確にはわかりません。 「深い」比較を行う場合は、類推はかなり近いです。注意すべきことの1つは、物理的な同等性がOCaml(および関数型言語一般)の滑りやすい概念であることです。コンパイラとランタイムシステムは値を移動し、純粋な(変更不可の)値を自由にマージおよびアンマージします。したがって、==は、自分が何をしているか本当にわかっている場合にのみ使用してください。ある程度、実装に精通している必要があります(これは、必要でない限り避けるべきことです)。

OCamlが==に対して行う具体的な保証は弱いものです。変更可能な値は、期待どおりに物理的に等しいと比較されます(つまり、2つのうちの1つを変更すると、実際にはもう1つも変更されます)。ただし、変更不可能な値の場合、唯一の保証は、物理的に等しい値(==)も等しい(=)として比較されることです。 sepp2kが浮動値を指すため、逆はnot trueであることに注意してください。

本質的に、言語仕様が変更不可能な値についてあなたに言っていることは、2つの変更不可能な値が等しいかどうかを判断するためのクイックチェックとして==を使用できることです(=)。それらが物理的に等しい場合、それらは値的に等しいです。それらが物理的に等しいと比較しない場合、それらが値的に等しいかどうかはわかりません。あなたはまだ=を使用して決定する必要があります。

28

それは、Javaのx.equals(y)と同じように、ocamlのx = yですか?

そして、Javaのx == y(アドレスを比較する)のようにx == y?

はい、それだけです。 OCamlでは、すべての種類の値に=を使用できますが、Javaでは、プリミティブ型ではequalsを使用できません。別の違いは、フローティングOCamlの点数は参照型であるため、==を使用してそれらを比較しないでください(一般に、浮動小数点数を比較して直接等しいかどうかを確認することはお勧めしません)。

つまり、要約すると、基本的に常に=を使用してあらゆる種類の値を比較する必要があります。

8
sepp2k

http://rigaux.org/language-study/syntax-across-languages-per-language/OCaml.html によると、==は浅い同等性をチェックし、=深い等価性をチェック

2
Sam I am