5

return "abc"ghciで印刷したときの型は何ですか?

問題のポイントは、それがモナドで多形的であるということです:

ghci> :t return "abc"
return "abc" :: (Monad m) => m [Char]

出力されるものは、選択されたモナドによって異なります。

ghci> return "abc" :: Maybe String
Just "abc"

ghci> return "abc" :: [] String
["abc"]

しかし、実際に印刷されたものは次のとおりです。

ghci> return "abc"
"abc"
4

2 に答える 2

7

GHCiに式exprを入力すると、次のことが起こります:

  • 式は型チェックされます。エラーがあれば、GHCi はエラーを伝えてあきらめます。
  • それ以外の場合、 sayexprが type を持つことが判明したとしますttGHC は とのマッチングを試み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 StringStringは のインスタンスShowなので、GHCi は次のようにします。

it <- return "abc"
print it

これは、モナドの法則により、単に行うのとまったく同じです

print "abc"

したがって、結果。

于 2012-08-13T17:25:21.383 に答える
4

Haskell には、数値を含む式の型を決定するための、やや不可解な一連の規則があります。あいまいなタイプとデフォルト インスタンスに関するレポート セクションを参照できます。したがって、一般的な質問に対する答えは複雑です。しかし、GHCi 内では、式eを入力すると、次のルールを適用することができます。

  • eIO Tが何らかの type のように型付けできT、かつインスタンスTがあるShow場合、GHCi は計算を実行し、 type の結果の値を出力しTます。それがあなたの3番目の例で起こっていることです。

  • eをモナドに *入力できない* 場合IO、デフォルトインスタンスのルールが適用され、GHCi はそれらのルールに従って型を選択します。型がShowインスタンスを持つ場合、GHCi はshow eを出力します。それが最初の 2 つの例で起こっていることです: Maybe Stringandはインスタンス [String]を持つ純粋な値です。Show

    eの型がインスタンスを持たない場合Show、GHCi は文句を言います。のような式を入力すると、それが起こりますflip take

于 2012-08-13T17:04:32.737 に答える