GHCi "let" - ¿qué hace?
Agradecería que alguien pudiera señalar a docs lo que "let" hace en GHCi, o en su defecto, explicarlo convincentemente :-).
Hasta donde puedo decir, "let" (sin "in") no es parte del lenguaje Haskell per se, y por otro lado, tampoco parece ser un comando GHCI, ya que no tiene el prefijo de dos puntos.
4 answers
Mientras se programa en GHCi, es como programar en la mónada IO con sintaxis do
, así que por ejemplo puede ejecutar directamente una acción IO
, o usar sintaxis de enlace monádico como r <- someIOFun
.
let
también forma parte de do
así que también puedes usar esto. Creo que está siendo desugared en let .. in <rest of the computation>
, así que por ejemplo cuando haces esto:
ghci> let a = 1
ghci> someFun
ghci> someFun2
Es como:
let a = 1 in
do someFun
someFun2
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-05 15:44:31
Aquí está la parte relevante de la documentación .
Las sentencias GHCI se ejecutan como cómputo IO. Así que let
es lo mismo que lo que tienes dentro de una mónada IO
donde enlazas expresiones no-IO usando let
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-08 23:21:17
Para más detalles de abajo al código, este comentario en TcRnDriver.lhs podría ser esclarecedor:
--------------------------------------------------------------------------
Typechecking Stmts in GHCi
Here is the grand plan, implemented in tcUserStmt
What you type The IO [HValue] that hscStmt returns
------------- ------------------------------------
let pat = expr ==> let pat = expr in return [coerce HVal x, coerce HVal y, ...]
bindings: [x,y,...]
pat <- expr ==> expr >>= \ pat -> return [coerce HVal x, coerce HVal y, ...]
bindings: [x,y,...]
expr (of IO type) ==> expr >>= \ it -> return [coerce HVal it]
[NB: result not printed] bindings: [it]
expr (of non-IO type, ==> let it = expr in print it >> return [coerce HVal it]
result showable) bindings: [it]
expr (of non-IO type,
result not showable) ==> error
Así que un comando en el prompt de GHCi puede tener hasta tres efectos: Se evalúa algún código, se imprimen algunas cosas y se enlazan algunos nombres de variables. Su caso (el primero en el comentario) enlaza variables, pero no se imprime.
La sintaxis se parece a la notación do, por lo que la respuesta de @sinan es algo correcta, pero no es realmente lo que está sucediendo bajo el capó – de lo contrario, por ejemplo, nunca se imprimiría nada.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-27 11:51:05
Los comandos GHCI se ejecutan en la mónada IO y utilizan la sintaxis do, por lo que se aplican las reglas de desugaring. Desde El Mundo Real Haskell
doNotation4 =
do let val1 = expr1
val2 = expr2
{- ... etc. -}
valN = exprN
act1
act2
{- ... etc. -}
actN
Se traduce como:
translated4 =
let val1 = expr1
val2 = expr2
{- ... etc. -}
valN = exprN
in do act1
act2
{- ... etc. -}
actN
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-27 09:20:29