ventajas val learn for example effective docs desventajas ocaml

val - ocaml vs haskell



¿Tiene!=Significado en OCaml? (5)

Parece ser una comparación de equivalencia para algunos tipos, pero no para 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?


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

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

Entonces no son == porque son DOS cadenas diferentes almacenan en diferentes (Memoria) ubicación

Son = porque tienen el mismo valor de cadena .

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

Por su conveniencia:

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


Lo contrario para != operador es == operador, no el = uno.

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

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

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


Los Ints son el único tipo en el que la igualdad física y estructural es la misma, porque los Ints son el único tipo que se desempaqueta


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 quiere 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 apunta x . 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 está viendo aquí son los resultados de una optimización de otra manera útil que involucra flotadores.

2 / Por otro lado, hay una manera segura de usar == , y eso es una manera 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 manera rápida de detectar que obviamente son estructuralmente iguales, sin siquiera tener que recurrir y leerlos. Es decir:

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 "flojo",

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


has experimentado la diferencia entre igualdad estructural y física.

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

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

es falso porque cada instancia se instancia 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 <> .

edite sobre cuándo la igualdad estructural y física son equivalentes :

Puede usar la función what_is_it y descubrir 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, los caracteres, enteros, unidades, listas vacías y algunas instancias de tipos variantes tendrán esta propiedad.