GHCi "niech" - co to robi?

Byłbym wdzięczny, gdyby ktoś mógł wskazać na to, co" let " robi w GHCi, lub jeśli tego nie zrobi, to wyjaśni to przekonująco :-).

O ile mogę powiedzieć, "let "(bez" in") nie jest częścią języka Haskell per se, a z drugiej strony, nie wydaje się być komendą GHCI, ponieważ nie jest poprzedzona dwukropkiem.

Author: thefourtheye, 2012-12-27

4 answers

Podczas programowania w GHCi, jesteś jak programowanie w IO monad ze składnią do, więc na przykład możesz bezpośrednio wykonać akcję IO lub użyć monadycznej składni bind, takiej jak r <- someIOFun.

let jest również częścią do, więc możesz również użyć tego. Myślę, że to jest desugared do let .. in <rest of the computation>, więc na przykład, gdy robisz to:

ghci> let a = 1
ghci> someFun
ghci> someFun2

Jest jak:

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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-05 15:44:31

Oto odpowiednia część dokumentacji .

Instrukcje GHCI są wykonywane jako obliczenia IO. Tak więc let jest takie samo jak to, co masz wewnątrz IO monady, gdzie wiążesz wyrażenie nie-IO za pomocą 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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-08 23:21:17

Aby uzyskać więcej szczegółów w kodzie, ten komentarz w TcRnDriver.lhs może być pouczające:

--------------------------------------------------------------------------
                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

Więc polecenie w wierszu polecenia GHCi może mieć do trzech efektów: część kodu jest oceniana, niektóre rzeczy są drukowane, a niektóre nazwy zmiennych są powiązane. Twój przypadek (pierwszy w komentarzu) wiąże zmienne, ale nie drukuje.

Składnia przypomina notację do, więc odpowiedź @ sinan jest w pewnym sensie słuszna, ale tak naprawdę nie jest to, co dzieje się pod maską – w przeciwnym razie, na przykład, nic nigdy nie zostanie wydrukowane.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-27 11:51:05

Polecenia GHCI są wykonywane w MONADZIE IO i używają składni do, więc mają zastosowanie reguły usuwania ubytków. From Real World Haskell

doNotation4 =
    do let val1 = expr1
           val2 = expr2
           {- ... etc. -}
           valN = exprN
       act1
       act2
       {- ... etc. -}
       actN

Tłumaczy się na:

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/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-27 09:20:29