「let」が GHCi で何をするかについて誰かがドキュメントを指摘してくれたり、それが失敗した場合に説得力のある説明をしてくれたりしてくれれば幸いです。
私が知る限り、"let" ("in" なし) は Haskell 言語自体の一部ではありません。一方、コロンが前に付いていないため、GHCi コマンドのようにも見えません。 .
GHCi でプログラミングしている間は、do
構文を使用して IO モナドでプログラミングするようなものです。たとえば、アクションを直接実行したり、 のIO
ようなモナド バインド構文を使用したりできますr <- someIOFun
。
let
も一部なdo
のでこちらも使えます。に脱糖されていると思うlet .. in <rest of the computation>
ので、たとえばこれを行うと:
ghci> let a = 1
ghci> someFun
ghci> someFun2
それは次のようなものです:
let a = 1 in
do someFun
someFun2
ドキュメントの関連部分は次のとおりです。
GHCI ステートメントは IO 計算として実行されます。を使用して非 IO 式をバインドするモナド内let
にあるものと同じです。IO
let
コードの詳細については、TcRnDriver.lhsの次のコメントが参考になるかもしれません。
--------------------------------------------------------------------------
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
したがって、GHCi プロンプトでのコマンドは、最大 3 つの効果を持つことができます: コードが評価され、出力され、変数名がバインドされます。あなたのケース(コメントの最初のもの)は変数をバインドしますが、出力しません。
構文は do 表記に似ているため、@sinan の答えはある程度正しいですが、実際には内部で起こっていることではありません。たとえば、何も出力されません。