2016-08-10 5 views
3

私はハスケルに新しいので、これはノブの質問かもしれません。GHCiは多態性アクションに使用するMonad型クラスのインスタンスをどのように選択しますか?

私が行ったときreturn 10 >>= return GHCiは10を示しています。 return 10のタイプを:tにチェックすると、それはちょうどreturn 10 :: (Monad m, Num a) => m aと表示され、私はtypeOf return 10とエラーが発生します。

私が理解する限り、>>=の特定のインスタンスを使用してreturn 10 >>= returnを評価する必要があります。そのため、どのインスタンスを使用し、どちらを使用するかはどのように決定しましたか?

+1

私はこれを一時的に「[単一形体の制限とは何ですか?](http://stackoverflow.com/questions/32496864/what-is-the-monomorphism-restriction)」の複製としてクローズしました。この質問は、 'a'に対して' Num'インスタンスがどのように選ばれるかを扱っていますが、 'm'のために' Monad'インスタンスがどのように選択されているのかについては言及していません。だから私はそれがかなり重複していないと思うし、慎重な答えが必要です。 –

+1

実際には、モナドの特定のインスタンスが汎用モナドに対してどのように選択されているかを尋ねています。私はリストの '' = = 'を使って推測していますが、なぜそれがわかりません。 – Juan

+1

IOモナドかもしれないと思う。通常、ghciはREPLの結果を 'print'しようとしますが、IOアクションが発生した場合は代わりに_executes_し、アクションによって返された結果を出力します。 '(Monad m、Num a)=> m a'のような型は' IO a'と互換性があり、それは現在のREPL式を実行するかどうかを決めるのに使う基準です。 – ErikR

答えて

7

これは、GHCiが巨人のようなものであるという考え方に従います。doブロックがIOです。式である何かを入力すると、最初に、結果の型が何かに特殊化できるかどうかを確認しようとします。IO a。可能であれば、IOアクションを実行し、結果を出力するだけです。そうでなければ、式自体の結果を出力します。

GHCiが必要な特定のモナドに移動するように強制するには、タイプ注釈を追加します。 IOがどのように扱われるかに注意してください(表現がアノテーションなしで扱われたのと同じ方法です)。

ghci> return 10 >>= return :: Maybe Int 
Just 10 
ghci> return 10 >>= return :: [Int] 
[10] 
ghci> return 10 >>= return :: IO Int 
10 

さておき、Numのどのインスタンスについて、全く別の問題があるとして選択され、その一つが不履行ルールや単相性制限に関係するすべてのものを持っています。

+0

モナド以外のtypeclassを使用するあいまいな式を使用すると、デフォルトのものを選択するのではなく、エラーが出るはずです。 – Juan

+0

@Juanもし私があなたを正しく理解していれば、はい。 – Alec

+0

@Juan、例えば 'ghci'に' return mempty'と入力すると、あいまいな型のエラーが出ます。 – villou24

関連する問題