2017-06-09 12 views
0

モナドの理解を深めようとしています。 私はいくつかのモナドのリターン、ジョイン、およびバインドの実装を記述しようとしています。2種類のモナドの結合関数

しかし、二kindedモナドに来たとき、私は一種の混乱している

join :: m (m a) -> m a 

m (m a)はモナドの内側に包まれたモナドことを意味しますが、2-kindedモナドを使用している場合どのような値が暗示されます。 たとえばState Monadの場合:sまたはa?ステートモナドの参加の正しい署名はどのように見えますか?

+4

"2種類の"モナドはありません。すべてのMonadインスタンスは種類が* *> *です。 –

+1

関数アプリケーションと同様に、型コンストラクタはleftを関連付けます。したがって、もしあなたが 'Foo a b c d'をタイプしていれば、 'Foo Int Char Bool'は種類*' * * 'を持ち、インスタンスMonad(Foo Int Char Bool)を定義することができます。 '::((Foo Int)Char)Bool)Baz' – jberryman

+0

@ReinHeinrichs" Monadインスタンスを持つ2種類のデータ型 "を読む – hgiesel

答えて

10

状態モナド型はState s aと宣言されています。 m ~ State sの場合は、m aとのみ統合されます。

join :: State s (State s a) -> State s a