2012-08-13 5 views
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" 
+5

IO。 ghciセッションは特別な巨大なIO Monadのようなものです! – is7s

答えて

7

、以下のことが起こる:

  • 式は型チェックされます。エラーがある場合、GHCiはエラーを通知し、諦めます。
  • のタイプがtであると判断された場合、 GHCはtIO aを照合しようとします。
  • 成功した場合はit <- exprのように実行し、aShowのインスタンスで、()でない場合は、print itを実行します。
  • t自体がShowのインスタンスである場合、GHCiはlet it = expr、次にprint itのようになります。
  • そうでなければ、それは文句を言う。

本質的には、IOアクションの実行とそれらが返す値の取得の両方を行うGHCiプロンプトと、純粋な値で遊んで何が得られるかを見る方法が必要です。それで、GHCiは、あなたがIOアクションを使用しているように見える場合、GHCiはそれを行い、そのアクションが表示され、興味深い結果を持っている場合(つまり、()ではなく)あなたに結果。あなたに結果を示すことができない場合、大したことはありません。とにかくIOアクションを実行したかったのかもしれません。結果が欲しい場合は<-という名前にします。一方、あなたの式がではなく、 IOアクションの場合、GHCiはそれを計算してあなたに表示します。表示できない場合は、GHCiは何も役に立ちません(副作用なし時間)、それで不平を言う。

この場合

IO Stringとしてreturn "abc" typechecks、およびGHCiのはモナドの法則によってちょうど

print "abc" 
を行うとまったく同じである

it <- return "abc" 
print it 

のような何かをするようStringは、Showのインスタンスでありますしたがって、結果は

です。

4

ハスケルには、タイプを決定するためのやや難解なルールがあります数字を含む表現のこと。 Report section on ambiguous types and default instancesが表示されます。ですから、一般的な質問に対する答えは複雑です。

  • 表現電子は、いくつかのタイプTためIO Tとして入力することができた場合は

    、及び場合Tが持っている:あなたが表現に電子を入力した場合でも、GHCiの中に、あなたは適用するためにこれらのルールに頼ることができますShowインスタンスの場合、GHCiは計算を実行し、結果の値Tの値を出力します。それはあなたの3番目の例で起こっていることです。

  • 表現電子 *は* IOモナドで入力することができない場合は、デフォルト・インスタンスのルールは遊びに来て、GHCiのは、それらのルールに従ってタイプを選択します。タイプがShowの場合、GHCiはshoweを印刷します。あなたの最初の2つの例でこれが起こります。Maybe String[String]は、Showインスタンスの純粋な値です。

    電子のタイプはShowインスタンスを持っていない場合は、GHCiのは文句を言うでしょう。これはflip takeのような式を入力すると起こります。あなたはGHCiのに表現exprを入力すると

+2

私は、質問が明らかにghciについてのものであり、規則が違うという事実は、最初の2つの文章が誤解を招くようになると思います。さらに、GHCiは、関連する型が 'Show'ableでないか、'() 'であれば、あなたが入力した' IO'アクションの結果を表示しようとしません。それ以上のルールがないかどうかはわかりません。また、GHCiのデフォルトルールは標準のHaskellよりも強力です。 –

関連する問題