Los lenguajes Ocaml y Haskell descienden del lenguaje ISWIM, descrito en el famoso art铆culo de Peter Lendin "Los pr贸ximos 700 lenguajes de programaci贸n". En 茅l, el autor, a partir del lenguaje LISP, crea un nuevo lenguaje de programaci贸n y, en particular, presenta palabras clave let
, and
y where
, que son ampliamente utilizados en los idiomas de la familia ML. Tarde o temprano, cualquier mente inquisitiva, comprometida con la programaci贸n funcional, tiene una pregunta: 驴por qu茅 la palabra clave where
ampliamente utilizada en Haskell no ech贸 ra铆ces en Ocaml ?
Desde mi punto de vista, esto se debe principalmente a las diferencias en la sem谩ntica de estos lenguajes, a saber, la naturaleza imperativo-energ茅tica de Ocaml y la pureza-pereza de la evaluaci贸n en Haskell (que est谩n directa y fuertemente relacionados con los caracteres impuros / puros de estos idiomas).
Ambas expresiones, let
y where
, se derivan del (let ...)
lenguaje LISP, que tiene dos variantes de esta forma especial: (let ...)
y (let* ...)
. La variante se (let* ...)
diferencia en que todos los enlaces en el bloque ocurren secuencialmente y pueden depender entre s铆:
(let* ((x 3)
(y (+ x 2))
(z (+ x y 5)))
(* x z))
En algunos dialectos de Scheme, el int茅rprete puede reordenar autom谩ticamente las declaraciones de variables, por lo que resulta innecesario escribirlas en el orden "correcto". Ambas opciones de encuadernaci贸n let ... in
y where
corresponden a esta opci贸n "avanzada" (let* ...)
. Sin embargo, Ocaml usa una palabra clave para separar "enlaces paralelos" and
, mientras que Haskell simplemente los pone en un bloque.
Si observa exclusivamente la esencia de las cosas, puede ver que las expresiones let ... in
y where
difieren en dos aspectos: el lugar donde se coloca la encuadernaci贸n y el n煤mero de expresiones en el bloque.
Nombres vinculantes antes y despu茅s de su uso.
- let ... in
, , where
:
let x = 1 in
x + 1
z = x + 1
where x = 1
, let ... in Ocaml, , , / . ,
let x = Printf.printf "Hello ";
"World!"
in
Printf.printf "%s" x
. top-level Ocaml, , open
let () = ...
, where non-strict Haskell, term/graph reduction. , where
, :
main = putStrLn (x ++ y)
where x = "Hello "
y = "World!"
z = undefined
: x
y
, . z
, - .
x
, y
, z
let ... in
, Haskell, - z
, . , do
, let
.
shadowing
C let ... in
, Ocaml, Haskell, . where
- :
let x = 1 in
let y = 1 in
x + y
z = x + y
where x = 1
y = 1
, , , , , , "shadowing". Ocaml shadowing , :
let x = 1 in
let x = x * 10 in
x * x
, , :
x := 1;
x := x * 10;
return x*x;
Haskell, where
, "", shadowing , . shadowing , top-level , - non-strict . , Haskell
x = x + 1
.
shadowing Ocaml Haskell , Ocaml , Ocaml Haskell (backpack , - t
M
Ocaml ).
Ocaml , -, (.mli) (.ml). , , -, , top-level , . - , Ocaml top-level , . , let ... in (., report_constructor_mismatch https://github.com/ocaml/ocaml/blob/trunk/typing/includecore.ml#L212 )
Haskell , . , , - , , top-level . , where shadowing.
, , - Clean.
, , where
, let ... in
"-", , . , , , Haskell , Ocaml .
, Ocaml, Stdlib
where , , , . , List.mapi
List.rev_map
. , , Ocaml , , - graph rewriting . , Ocaml where
, , Haskell let ... in
.
As铆, como buenos trabajos de ingenier铆a, los lenguajes Ocaml y Haskell crean una sinergia de sintaxis y sem谩ntica. Directrices vinculantes let
y where
juegan un papel, haciendo hincapi茅 en el psevdoimperativnuyu lineal y el modelo de rendimiento "perezoso" (reducci贸n de gr谩ficos). Tambi茅n funcionan bien con el estilo de escritura de su aplicaci贸n preferido y el sistema de m贸dulo asociado.