ルック:どのようなバインド演算子が使用されますか?この例では
ReaderT Integer (ErrorT String (StateT Integer Identity)) Integer
何オペレータバインド(>>=)
は、ここで使用されるのですか?
たとえば、do
の表記を使用すると、コンパイラはどのバインド演算子を選択しますか?参考
ルック:どのようなバインド演算子が使用されますか?この例では
ReaderT Integer (ErrorT String (StateT Integer Identity)) Integer
何オペレータバインド(>>=)
は、ここで使用されるのですか?
たとえば、do
の表記を使用すると、コンパイラはどのバインド演算子を選択しますか?参考
、(>>=)
タイプに
(>>=) :: 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)) Integer
とm a
を統合しようとします。これが一元化する唯一の方法は、をInteger
とし、m
をReaderT Integer (ErrorT String (StateT Integer Identity))
とすることです。だから、~
型平等表記を使用して、我々はその結果
m ~ (ReaderT Integer (ErrorT String (StateT Integer Identity)))
a ~ Integer
で終わる、それはMonad
、r ~ Integer
とn ~ ErrorT String (StateT Integer Identity)
の(ReaderT r n)
インスタンスを使用する必要があります。
これは、一般的には、(>>=)
の場合だけでなく、Haskellでの型統一の結果です。したがって、この一般的な考え方は、他の多態関数の型チェックがどのように機能するかを解釈するために使用できます。
bindはbindの左引数に基づいて選択されますか? –
@ HaskellFun右の引数の戻り値の型(ここでは 'f')が左の引数と同じMonadインスタンスを使用しなかった場合、コンパイラはコンパイラエラーを返します。また、左引数のモナドインスタンスが多形性のままで、右引数が特定のモナドを使用する場合、右引数のモナドに基づいて一致します。 –
'x >> = f'を指定すると、コンパイラは' m'と '' x' *と* '(a - > mb)'の型を 'f'の型と比較しようとします。 –
'ReaderT's bind。ソースを見て、それが何であるかを見ることができます。 – PyRulez
あなたはそれを知っているからですか? –
これは一番外側のコンストラクタです。一番外側のコンストラクタがそれを制御します。 – PyRulez