Su última pregunta es cómo se usa ()
para "ocultar un efecto secundario". Probablemente se esté refiriendo a la evaluación demorada de una función. Aquí está un ejemplo:
let p x = print_string "abc";;
let q = print_string "abc";;
Hay una diferencia crucial entre p
y q
. La diferencia es que p
es una función de tipo 'a -> unit
mientras que q
es un valor de tipo unit
. Cuando define p
, no se imprime nada. La cadena "abc" se imprimirá solo cuando aplique la función p
a un argumento, es decir, cuando evalúe p 1
o p "blah"
o lo que sea. (La función p
toma argumentos de cualquier tipo y los ignora). Por lo tanto, en el caso de p
, ha "ocultado un efecto secundario" dentro de la función.
No tiene sentido tener un argumento, "x", en la definición de "p x", ya que "x" no se usa en absoluto. Entonces, para simplificar, se usa el tipo "unidad", de modo que la definición de "p" se parece a "let p() = ...". Es lo mismo que
let p = fun() -> print_string "abc";;
La función "p" se utiliza como "p()". Esto puede ser confuso si primero aprendió lenguajes de programación como C, Java, etc., donde() se usan para argumentos de todas las funciones. Pero en OCAML, ()
es un símbolo especial que denota un "valor vacío", y este valor tiene un tipo especial llamado "unidad".Lo
Un totalmente diferente sucede como se define q
: la cadena "abc" se imprime de inmediato, ya que este es el efecto secundario de la evaluación "print_string", y q
se hace igual a ()
, ya ()
es el valor resultante obtenido al evaluar "print_string".
es posible que desee para acostumbrarse a usar 'print_endline' en lugar de' print_string' porque imprime automáticamente una línea de fondo después de – newacct