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.

Author: thefourtheye, 2012-12-27

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
 30
Author: sinan,
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.

 11
Author: Satvik,
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.

 9
Author: Joachim Breitner,
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
 4
Author: Boris,
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