Краткое объяснение ==
и !=
в OCaml в дополнение ко всем правильным ответам, которые уже были предоставлены:
1 / ==
и !=
раскрывают детали реализации, о которых вы действительно не хотите знать. Пример:
# let x = Some [] ;;
val x : 'a list option = Some []
# let t = Array.create 1 x ;;
val t : '_a list option array = [|Some []|]
# x == t.(0) ;;
- : bool = true
Пока все хорошо: x
и t.(0)
физически равны, потому что t.(0)
содержит указатель на тот же блок, на который указывает x
. Это то, что требует базовых знаний о реализации. НО:
# let x = 1.125 ;;
val x : float = 1.125
# let t = Array.create 1 x ;;
val t : float array = [|1.125|]
# x == t.(0) ;;
- : bool = false
То, что вы видите здесь, является результатами полезной в других отношениях оптимизации с использованием поплавков.
2 / С другой стороны, есть безопасный способ использования ==
, и это быстрый, но неполный способ проверки на структурное равенство.
Если вы пишете функцию равенства на бинарных деревьях
let equal t1 t2 =
match ...
проверка t1
и t2
на физическое равенство - это быстрый способ обнаружить, что они явно структурно равны, даже не требуя их повторения и чтения. То есть:
let equal t1 t2 =
if t1 == t2
then true
else
match ...
И если учесть, что в OCaml оператор «boolean or» является «lazy»,
let equal t1 t1 =
(t1 == t2) ||
match ...