2016-11-23 8 views
2
utop # [1;2];; 
- : int list = [1; 2] 
utop # 1::2::[];; 
- : int list = [1; 2] 
utop # 1::2::[] == [1;2];; 
- : bool = false 

個別に評価された2つの式は同じに見えますが、なぜOCaml等価関数はfalseを返すのですか?1 :: 2 :: []と[1; 2]はOCamlで==の点で同じではないのはなぜですか?

+0

このコードを再フォーマットしてください。 –

+5

私はocamlについて何も知らないが、オンラインインタプリタで1 :: 2 :: [] == 1 :: 2 :: [] ;; falseを返します。これは、==演算子がオペランドが等しい場合ではなく、同じオブジェクト参照であるかどうかをテストすると考えることができます。私はocaml専門用語を知らない、私はそれが私が意味するものが明確であることを願っています。 – Eineki

+1

これは*ほとんどの*言語に当てはまることに注意してください。参照型は、ほとんどの場合、ポインタ比較によって等価性がテストされます。デフォルトがコンテナーの内容の深い比較であった場合、パフォーマンスを予測することは非常に困難です。 –

答えて

19

==オペレータは構造平等のためではなく、物理平等のために立っていません。 Cのような話では、値を比較するのではなく、ポインタを比較します。メモの編集をしていない限り、変更不可能な値で使用することは一般的にはお勧めできません。

OCaml manual引用する:e1e2の物理的な平等のための

e1 == e2テストを。参照、配列、バイトシーケンス、変更可能なフィールドを持つレコード、変更可能なインスタンス変数を持つオブジェクトなどe1 == e2の物理的な変更がe1の物理的な変更がe2にも影響する場合にのみtrueになります。非可変型では、(==)の振る舞いは実装依存です。ただし、e1 == e2にはcompare e1 e2 = 0が含まれていることが保証されています。

構造平等をテストする=演算子を使用しようとすると、

utop # 1::2::[] = [1;2];; 
- : bool = true 
関連する問題