Let vs where en Ocaml / Haskell

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.








All Articles