62 votes

Est-ce que! = A une signification dans OCaml?

Cela semble être une comparaison d'équivalence pour certains types, mais pas pour les chaînes.

 # 3 != 3;;
- : bool = false
# 3 != 2;;
- : bool = true
 

C'est comme prévu.

 # "odp" = "odp";;
- : bool = true
# "odp" != "odp";;
- : bool = true
# "odp" <> "odp";;
- : bool = false
 

Pourquoi "odp" != "odp" évalués à true ? Que fait-il réellement? Ne devrait-il pas générer une erreur de type?

93voto

nlucaroni Points 21502

vous avez expérimenté la différence entre structurales et physiques de l'égalité.

<> est = (l'égalité structurelle) comme != est == (physique de l'égalité)

"odg" = "odg"  (* true  *)
"odg" == "odg" (* false *)

est faux parce que chacun est instancié dans différents emplacements de mémoire, en faisant:

let v = "odg"
v == v (* true *)
v = v  (* true *)

La plupart du temps, vous aurez envie d'utiliser = et <>.

modifier au sujet de laquelle les structures physique et l'égalité sont équivalentes:

Vous pouvez utiliser le what_is_it fonction et trouver tous les types qui serait égale à la fois structurellement et physiquement. Comme mentionné dans les commentaires ci-dessous, et dans l'article lié, des caractères, des entiers, l'unité, la liste vide, et certains cas de la variante de types ont cette propriété.

16voto

Pavel Shved Points 34706

L'opposé pour != opérateur est == opérateur, et non pas = un.

 # "a" != "a" ;;
- : bool = true
# "a" == "a" ;;
- : bool = false
 

L'opérateur == est une "égalité physique". Lorsque vous tapez "a" == "a" , vous comparez deux instances différentes de chaînes qui se ressemblent et l'opérateur renvoie donc false . Tout en ayant une instance le retourne vrai:

 # let str = "a"
  in str == str ;;
- : bool = true
# let str = "a"
  in str != str ;;
- : bool = false
 

12voto

Pascal Cuoq Points 39606

Une explication rapide sur == et != en OCaml, en plus de toutes les bonnes réponses qui ont déjà été prévus:

1/ == et != exposer les détails de mise en œuvre que vous ne voulez vraiment pas savoir. 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

So far, so good: x et t.(0) sont égales sur le plan physique, car t.(0) contient un pointeur vers le même bloc que l' x pointe. C'est ce que les connaissances 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'un ailleurs utile d'optimisation impliquant des chars.

2/ d'autre part, il existe un moyen sûr d'utiliser ==, et qui est comme un rapidement, mais de manière incomplète pour vérifier l'égalité structurelle.

Si vous écrivez une égalité fonction des arbres binaires

let equal t1 t2 =
  match ...

vérification de l' t1 et t2 pour la physique de l'égalité est un moyen rapide pour détecter que bien sûr ils sont structurellement égal, sans même avoir à les répéter et de les lire. C'est:

let equal t1 t2 =
  if t1 == t2
  then true
  else 
    match ...

Et si vous gardez à l'esprit que dans le cas d'OCaml le "ou logique" de l'opérateur est "paresseux",

let equal t1 t1 =
  (t1 == t2) ||
  match ...

2voto

marsrover Points 160

Ils sont comme les deux "Tom"s dans votre classe! Parce que:

Dans ce cas, "odp" = "odp" parce qu'ils sont DEUX chaînes de caractères avec la MÊME VALEUR!!

Ils ne sont donc pas == parce qu'ils sont DEUX différentes chaînes de magasin en différentes (de Mémoire) emplacement

Ils sont = parce qu'ils ont la même chaîne de valeur.

Une étape de plus profond, "odp" est anonyme variable. Et deux anonymes variable conduit à Deux cordes.

Pour votre confort:

# "odp" = "odp";; 
- : bool = true 
# "odp" != "odp";; 
- : bool = true 
# "odp" <> "odp";; 
- : bool = false

0voto

newacct Points 42530

ints est le seul type où l'égalité physique et structurelle est la même, car ints est le seul type qui n'a pas de boîte

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X