2012-04-04 11 views
8

Mam funkcję, która zwraca [[]], i chcę przetestować wynik jako test jednostkowy. Ale znalazłem, że wyrażenie [[]] == [[]] zwraca false. Oto prosty kod testowy:OCaml wyrażenie logiczne [[]] == [[]]

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

Czy ktoś może mi wyjaśnić dlaczego to wyrażenie jest oceniane jako fałszywe?

Dzięki.

+0

Więcej informacji na temat równości strukturalnej i fizycznej można znaleźć w innym pytaniu: http://stackoverflow.com/questions/1412668/does-have-meaning-in-oca ml/ – nlucaroni

Odpowiedz

13

Zastosowanie = skoro masz równości strukturalnej do porównywania dwóch wartości:

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

Ponieważ == jest równość odniesienie, to tylko zwraca true, jeśli odnoszą się do tej samej lokalizacji pamięci:

let a = [[]] 
let b = a 

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

Operator == w OCaml oznacza "fizyczną równość". Jednak masz dwie (fizycznie) różne listy. Prawdopodobnie chcesz "strukturalnej równości", która jest testowana przez =.

+0

Ok Jestem teraz. Ale oznacza to, że pierwsza [[]] jest "listą list i drugą listą" b list "? – Atikae

+1

Tak, każdy '[]' przydziela nową listę (patrz http://www.cs.jhu.edu/~scott/pl/lectures/caml-intro.html), ale obie listy nie są * bardzo podobne * lista. – Matthias

+1

'[]' ma równość strukturalną i fizyczną (jest typu integer). Nie przydziela nowej listy. To zewnętrzne nawiasy tworzą nową listę, ponieważ '[[]] = ([] :: [])'. – nlucaroni