ocaml - programming - reasonml
¿Por qué algunas funciones OCaml toman() como parámetro? (3)
Ejemplo en módulo Unix:
val environment : unit -> string array
¿Por qué no solo?
val environment : string array
?
El parámetro unit ()
es similar a un parámetro void
en C. Denota una función que no usa su argumento para calcular algo.
En su ejemplo, el entorno puede ser cambiado por el programa, por lo que no puede ser simplemente un valor estático calculado al principio del programa, pero al mismo tiempo, su valor no depende de su argumento.
Por ejemplo:
let e1 = Unix.environment ();;
Unix.putenv "USER" "somebody_else";;
let e2 = Unix.environment ();;
e1 = e2;;
Y puede ver que e1
y e2
son diferentes, por lo que Unix.environment
no puede ser simplemente de tipo (string * string) array
, sino que debe ser una función.
Porque denota una función que toma un valor de tipo unidad como su parámetro. El tipo de unidad solo está habitado por el valor "()". Esto generalmente se usa para significar que la función realizará algún tipo de IO o inducirá un efecto secundario, y no necesita entrada. La segunda firma de tipo que proporcionó es la firma para un valor, no una función que se puede aplicar. Si alguna expresión estuviera vinculada a este nombre, esa expresión se evaluaría en el momento en que se produzca la vinculación de valores, no en el momento en que se hace referencia (como en el caso de la aplicación de función).
Si estuviera en un lenguaje perezoso, como Haskell, sin efectos secundarios y objetos que se evalúen solo cuando sea necesario, no habría necesidad de estos argumentos ficticios.
En OCaml, requerir un argumento de tipo unit
(cuyo único valor es ()
) sirve para congelar el cálculo hasta que se suministre el argumento. En este caso, congela el cálculo hasta que se debe calcular Unix.environment ()
, lo cual es especialmente importante ya que puede tener diferentes valores a lo largo del tiempo (nuevamente, OCaml tiene efectos secundarios).