GHCiに式exprを入力すると、次のことが起こります:
- 式は型チェックされます。エラーがあれば、GHCi はエラーを伝えてあきらめます。
- それ以外の場合、 say
exprが type を持つことが判明したとしますt。tGHC は とのマッチングを試みIO aます。
- 成功した
it <- expr場合aは のようなものを実行し、 が のインスタンスでShowあり でない()場合は を実行しprint itます。
- それが失敗し、
tそれ自体が のインスタンスである場合Show、GHCi は次のようなことlet it = exprを行いprint itます。
- そうでなければ、文句を言います。
本質的には、GHCi プロンプトで、IO アクションを実行してそれらが返す値を取得する方法と、純粋な値をいじって結果を確認する方法の両方が必要です。そのため、GHCi はそのように動作します: IO アクションを使用しているように見える場合、GHCi はそれを実行し、そのアクションに表示可能な結果があり、興味深い (つまり ではない()) 場合、結果を表示します。あなたへ。結果を表示できなくても、IO アクションを実行したかっただけなので、大した問題ではありません。結果が必要な場合は、 で名前を付け<-ます。一方、式が IO アクションではないように見える場合、GHCi はそれを計算して表示します。表示できない場合、GHCi は何も役に立ちません (今回は副作用はありません)。 、
この場合、return "abc"は として型チェックしIO String、Stringは のインスタンスShowなので、GHCi は次のようにします。
it <- return "abc"
print it
これは、モナドの法則により、単に行うのとまったく同じです
print "abc"
したがって、結果。