¡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?
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.
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
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 ...
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
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
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