2012-04-04 5 views
8

私は[[]]を返す関数を持っています。その結果をユニットテストとしてテストしたいと思います。 しかし、式[[]] == [[]]が返されるのは、falseです。 は、ここで簡単なテストコード:この式がfalseと評価される理由OCamlブール式[]] == [[]]

# [[]] == [[]];; 
- : bool = false 

誰かが私に説明できますか?

ありがとうございました。

+0

構造的および物理的な平等に関する詳細は、別の質問にあります。http://stackoverflow.com/questions/1412668/does-have-meaning-in-oca ml/ – nlucaroni

答えて

13

使用=あなたは2つの値を比較するための構造的平等を持っているので:

# [[]] = [[]];; 
- : bool = true 

==参照の等価ですので、あなたが同じメモリ位置を参照する場合、それだけでtrueを返す:

let a = [[]] 
let b = a 

# b == a;; 
- : bool = true 
9

OCamlの==オペレータは、「物理的平等」を意味します。しかし、あなたは2つの(物理的に)異なるリストを持っています。おそらく、あなたは "構造的平等"を望んでおり、それは=によってテストされています。

+0

私は今確信しています。しかし、最初の[[]]は「リストリストと2番目のリスト」リストであることを意味しますか? – Atikae

+1

はい、それぞれの[]は新しいリスト(http://www.cs.jhu.edu/~scott/pl/lectures/caml-intro.html参照)を割り当てますが、両方のリストは*全く同じではありません*リスト。 – Matthias

+1

'[]'は構造的にも物理的にも等価です(整数的です)。新しいリストは割り当てられません。 '[[]] =([] :: [])'のように、新しいリストを作成するのは外側の括弧です。 – nlucaroni