Une explication rapide sur ==
y !=
en OCaml en plus de toutes les réponses correctes qui ont déjà été fournies :
1/ ==
y !=
exposer des détails de mise en œuvre que vous ne voulez vraiment pas connaître. Exemple :
# 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
Jusqu'à présent, tout va bien : x
y t.(0)
sont physiquement égaux car t.(0)
contient un pointeur sur le même bloc que x
pointe vers. C'est ce que la connaissance de base de la mise en œuvre dicte. MAIS :
# 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
Ce que vous voyez ici sont les résultats d'une optimisation autrement utile impliquant des flottants.
2/ D'autre part, il existe un moyen sûr d'utiliser ==
Il s'agit d'un moyen rapide mais incomplet de vérifier l'égalité structurelle.
Si vous écrivez une fonction d'égalité sur des arbres binaires
let equal t1 t2 =
match ...
vérification de t1
y t2
pour l'égalité physique est un moyen rapide de détecter qu'ils sont manifestement structurellement égaux, sans même devoir les récurer et les lire. C'est-à-dire :
let equal t1 t2 =
if t1 == t2
then true
else
match ...
Et si vous gardez à l'esprit qu'en OCaml l'opérateur "booléen ou" est "paresseux",
let equal t1 t1 =
(t1 == t2) ||
match ...