GHCiに式expr
を入力すると、次のことが起こります:
- 式は型チェックされます。エラーがあれば、GHCi はエラーを伝えてあきらめます。
- それ以外の場合、 say
expr
が type を持つことが判明したとしますt
。t
GHC は とのマッチングを試み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"
したがって、結果。