30

「let」が GHCi で何をするかについて誰かがドキュメントを指摘してくれたり、それが失敗した場合に説得力のある説明をしてくれたりしてくれれば幸いです。

私が知る限り、"let" ("in" なし) は Haskell 言語自体の一部ではありません。一方、コロンが前に付いていないため、GHCi コマンドのようにも見えません。 .

4

4 に答える 4

34

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
于 2012-12-27T09:19:26.437 に答える
12

ドキュメントの関連部分は次のとおりです。

GHCI ステートメントは IO 計算として実行されます。を使用して非 IO 式をバインドするモナド内letにあるものと同じです。IOlet

于 2012-12-27T09:14:25.893 に答える
9

コードの詳細については、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 の答えはある程度正しいですが、実際には内部で起こっていることではありません。たとえば、何も出力されません。

于 2012-12-27T11:51:05.987 に答える