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

Obwohl die beiden Ausdrücke, die einzeln ausgewertet werden, gleich aussehen, warum gibt die OCaml-Gleichheitsfunktion false zurück?Warum 1 :: 2 :: [] und [1; 2] sind in OCaml in Bezug auf == nicht identisch?

+0

Bitte formatieren Sie diesen Code neu. –

+5

Ich weiß nichts über Ocaml, aber mit einem Online-Interpreter bewertete ich das 1 :: 2 :: [] == 1 :: 2 :: [] ;; falsch zurückgeben. Dies lässt mich denken, dass der Operator == testet, wenn die Operanden die gleiche Objektreferenz sind, nicht wenn sie gleich sind. Ich kenne den Okaml-Jargon nicht, ich hoffe es ist klar, was ich meine. – Eineki

+1

Beachten Sie, dass dies für * die meisten * Sprachen gilt, Referenztypen werden fast immer auf Gleichheit durch Zeigervergleich getestet. Es wäre sehr schwierig, die Leistung vorherzusagen, wenn der Standard ein tiefer Vergleich des Containerinhalts wäre. –

Antwort

19

Der == Operator steht nicht für strukturelle Gleichheit, sondern für körperliche Gleichheit. In C-artiger Sprache vergleicht es nicht die Werte, sondern die Zeiger. Es ist im Allgemeinen nicht ratsam, sie für nicht veränderbare Werte zu verwenden (es sei denn, Sie führen Memo-Vorgänge durch).

zitieren die OCaml manual:

e1 == e2 Tests für physische Gleichheit von e1 und e2. Bei veränderlichen Typen wie Referenzen, Arrays, Bytefolgen, Datensätzen mit veränderbaren Feldern und Objekten mit veränderbaren Instanzvariablen ist e1 == e2 genau dann wahr, wenn die physische Änderung von e1 auch Auswirkungen auf e2 hat. Bei nicht veränderbaren Typen ist das Verhalten von (==) implementierungsabhängig; es ist jedoch garantiert, dass e1 == e2compare e1 e2 = 0 bedeutet.

Jetzt, wenn Sie versuchen, den Operator = zu verwenden, der strukturelle Gleichheit prüft.

utop # 1::2::[] = [1;2];; 
- : bool = true