13

この方程式を X について解くことはできますか?

Applicative はモナドであり、X はコモナドである

4

2 に答える 2

9

少し考えてみると、これは実際には後ろ向きの質問だと思います。ComonadApplyそれが にあるComonadと思うかもしれませんが、そうではありません。しかし、これを確認するために、PureScript の型クラス階層を使用してみましょう。ApplicativeMonad

class Functor f where
    fmap :: (a -> b) -> f a -> f b

class Functor f => Apply f where
    apply :: f (a -> b) -> f a -> f b -- (<*>)

class Apply f => Applicative f where
    pure :: a -> f a

class Applicative m => Monad m where
    bind :: m a -> (a -> m b) -> m b  -- (>>=)
 -- join :: m (m a) -> m a
 -- join = flip bind id

ご覧のとおり、ComonadApply単に(Apply w, Comonad w) => w. ただし、Applicativeでファンクターに値を注入する機能pureは、実際の違いです。

Comonadカテゴリカル双対としての a の定義は、returnの双対extractbindの双対extend(または as の双対による別duplicateの定義) で構成されますjoin

class Functor w => Comonad w where
    extract   :: w a -> a        
    extend    :: (w a -> b) -> w a -> w b
 -- extend f  = fmap f . duplicate k
 -- duplicate :: w a -> w (w a)
 -- duplicate = extend id

したがって、 からApplicativeまでのステップを見るとMonad、間の論理的なステップは、pureのデュアルを持つ型クラスになります。

class Apply w => Extract w where
    extract :: w a -> a

class Extract w => Comonad w where
    extend :: (w a -> b) -> w a -> w b

orextractの観点から定義することはできず、extendorの観点から/duplicateを定義することもできないことに注意してください。したがって、これは「論理的な」ステップのように見えます。ここではほとんど関係ありません。の法則が成り立つ限り、またはのいずれかに対して定義できます。purereturnbindjoinapplyExtractMonad

applyC f = fmap $ extract f   -- Comonad variant; needs only Extract actually (*)
applyM f = bind f . flip fmap -- Monad variant; we need join or bind

したがってExtract、(値を取得する) とは(値を取得する) ことComonad です。道に沿った多かれ少なかれ幸せな小さな事故です。Hask に を持っているが を持っていない(またはを持っていない、以下を参照) 型があるかどうかは興味深いですが、それらはかなりまれだと思います。ApplicativeMonadApplyExtractComonadExtendComonad

Extractまだ存在しないことに注意してください。しかし、どちらも2010 年のレポートApplicativeにはありませんでした。また、 andのインスタンスである型は、自動的に aと a の両方になります。これは、 andに関してandを定義できるためです。ExtractApplicativeMonadComonadbindextendextractpure

bindC :: Extract w => w a -> (a -> w b) -> w b
bindC k f = f $ extract k

extendM :: Applicative w => (w a -> b) -> w a -> w b
extendM f k = pure $ f k    

apply*の観点から定義できるということは、より実現可能なextract兆候ですが、 に分割され、したがってに分割される可能性があるため、多かれ少なかれ髪を分割しています。class Extend w => Comonad wMonadclass (Applicative f, Bind f) => Monad fComonad(Extend w, Extract w) => Comonad w

于 2016-01-19T20:21:02.380 に答える