¡Lo hace!= tiene significado en OCaml?


Parece ser una comparación de equivalencias para algunos tipos, pero no cadenas.

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

Esto es como se esperaba.

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

¿Por qué "odp" != "odp" evalúa a true? ¿Qué está haciendo realmente? ¿No debería generar un error de tipo?

 53
Author: Nick Heiner, 2009-09-11

5 answers

Usted ha experimentado la diferencia entre la igualdad estructural y física.

<> es a = (igualdad estructural) como != es a == (igualdad física)

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

Es false porque cada uno está instanciado en diferentes ubicaciones de memoria, haciendo:

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

La mayoría de las veces querrás usar = y <>.

editar acerca de cuándo la igualdad estructural y física son equivalentes :

Puede usar la función what_is_it y buscar fuera de todos los tipos que serían iguales tanto estructural como físicamente. Como se menciona en los comentarios a continuación, y en el artículo vinculado, caracteres, enteros, unidad, lista vacía, y algunas instancias de tipos de variantes tendrán esta propiedad.

 82
Author: nlucaroni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-24 15:47:08

Lo opuesto para el operador != es el operador ==, no el =.

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

El operador == es una "igualdad física". Cuando se escribe "a" == "a", se comparan dos diferentes instancias de cadenas que se parecen, por lo que el operador devuelve false. Mientras que tener una instancia hace que vuelva verdadero:

# let str = "a"
  in str == str ;;
- : bool = true
# let str = "a"
  in str != str ;;
- : bool = false
 14
Author: P Shved,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-11 19:00:34

Una explicación rápida sobre == y != en OCaml además de todas las respuestas correctas que ya se han proporcionado:

1/ == y != exponer detalles de implementación que realmente no quieres saber. Ejemplo:

# 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

Hasta ahora, todo bien: x y t.(0) son físicamente iguales porque t.(0) contiene un puntero al mismo bloque al que x está apuntando. Esto es lo que dicta el conocimiento básico de la implementación. PERO:

# 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

Lo que eres ver aquí son los resultados de una optimización de otra manera útil que implica flotadores.

2/ Por otro lado, hay una forma segura de usar ==, y esa es una forma rápida pero incompleta de verificar la igualdad estructural.

Si está escribiendo una función de igualdad en árboles binarios

let equal t1 t2 =
  match ...

Comprobar t1 y t2 para la igualdad física es una forma rápida de detectar que son obviamente estructuralmente iguales, sin siquiera tener que recurrir y leerlos. Que is:

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

Y si se tiene en cuenta que en OCaml el operador "booleano o" es "perezoso",

let equal t1 t1 =
  (t1 == t2) ||
  match ...
 12
Author: Pascal Cuoq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-04 16:36:22

¡Son como dos "Tom"en tu clase! Porque:

En este caso, "odp" = "odp" porque son DOS cadenas con MISMO VALOR!!

De Modo que no son == porque son DOS diferentes cadenas de tienda en diferentes (Memoria) ubicación

Son = porque tienen el valor de cadena idéntico.

Un paso más profundo, "odp" es variable anónima. Y dos variables anónimas conducen a esto Dos cadena.

Para su conveniencia:

# "odp" = "odp";; 
- : bool = true 
# "odp" != "odp";; 
- : bool = true 
# "odp" <> "odp";; 
- : bool = false
 2
Author: marsrover,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-25 09:40:58

Los INT son el único tipo donde la igualdad física y estructural es la misma, porque los int son el único tipo que no está en caja

 0
Author: newacct,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-11 19:06:12