2016-04-17 8 views
0

ルック:どのようなバインド演算子が使用されますか?この例では

ReaderT Integer (ErrorT String (StateT Integer Identity)) Integer 

何オペレータバインド(>>=)は、ここで使用されるのですか?
たとえば、doの表記を使用すると、コンパイラはどのバインド演算子を選択しますか?参考

+2

'ReaderT's bind。ソースを見て、それが何であるかを見ることができます。 – PyRulez

+0

あなたはそれを知っているからですか? –

+2

これは一番外側のコンストラクタです。一番外側のコンストラクタがそれを制御します。 – PyRulez

答えて

5

(>>=)タイプに

(>>=) :: Monad m => m a -> (a -> m b) -> m b 

を有し、また(機能アプリケーションのような)タイプのアプリケーションが残っているため

ReaderT Integer (ErrorT String (StateT Integer Identity)) Integer 

(ReaderT Integer (ErrorT String (StateT Integer Identity))) Integer 

と同じであることに注意してくださいハスケルの連想。

ので、適切な型と

x :: ReaderT Integer (ErrorT String (StateT Integer Identity)) Integer 

f与え、表現

x >>= f 

に型チェッカーは(>>=)の左側の引数の型とxのタイプに一致するようにしようとします。つまり、ReaderT Integer (ErrorT String (StateT Integer Identity)) Integerm aを統合しようとします。これが一元化する唯一の方法は、をIntegerとし、mReaderT Integer (ErrorT String (StateT Integer Identity))とすることです。だから、~型平等表記を使用して、我々はその結果

m ~ (ReaderT Integer (ErrorT String (StateT Integer Identity))) 
a ~ Integer 

で終わる、それはMonadr ~ Integern ~ ErrorT String (StateT Integer Identity)(ReaderT r n)インスタンスを使用する必要があります。

これは、一般的には、(>>=)の場合だけでなく、Haskellでの型統一の結果です。したがって、この一般的な考え方は、他の多態関数の型チェックがどのように機能するかを解釈するために使用できます。

+0

bindはbindの左引数に基づいて選択されますか? –

+2

@ HaskellFun右の引数の戻り値の型(ここでは 'f')が左の引数と同じMonadインスタンスを使用しなかった場合、コンパイラはコンパイラエラーを返します。また、左引数のモナドインスタンスが多形性のままで、右引数が特定のモナドを使用する場合、右引数のモナドに基づいて一致します。 –

+2

'x >> = f'を指定すると、コンパイラは' m'と '' x' *と* '(a - > mb)'の型を 'f'の型と比較しようとします。 –

関連する問題