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