6

私は主に実用的な人ですが、これは興味深いと思います。

私はモナド シーケンスについて考えてきましたが、明確にする必要があることがいくつかあります。したがって、ばかげているように聞こえるかもしれませんが、次のようになります。

モナドメンバーバインド

bind :: m b -> (b -> m c) -> m c

中間値への明示的なアクセスを提供する「アクション」をシーケンスできます。

これにより、カテゴリメンバー以上のものがどのように得られますか(.):

(.) :: cat b c -> cat a b -> cat a c

これにより、中間値をシーケンスしてアクセスすることができます。やっぱり(f . g) x = f(g (x))

でシーケンスできるのに、なぜbindシーケンスが必要なの(.)ですか?

4

1 に答える 1

14

あなたは正しい軌道に乗っています。すべてのモナドは、いわゆるKleisli 圏を生成します。すべてのモナドに対してm、対応する Kleisli カテゴリには矢印があり、それらは>=>a -> m bを使用して構成できます。これは次のように定義されます。

f >=> g     = \x -> f x >>= g

Kleisli型はこれを Haskell 型システムでカプセル化しており、インスタンスを持っていることがわかります。

instance Monad m => Category (Kleisli m) where
    id = Kleisli return
    (Kleisli f) . (Kleisli g) = Kleisli (g >=> f)

したがって、このカテゴリ内の計算の順序付けは、 を使用した順序付け操作にすぎず>=>、 を使用して同等に表現できます>>=

returnandを使用してモナドを定義する>>=のは、より便利だからですが、必要に応じて and を使用してモナドを定義することもできreturnます>=>

(モナドを見るさまざまな方法に対する私の回答も参照してください。)

于 2012-10-13T20:24:29.787 に答える