この方程式を X について解くことはできますか?
Applicative はモナドであり、X はコモナドである
少し考えてみると、これは実際には後ろ向きの質問だと思います。ComonadApply
それが にあるComonad
と思うかもしれませんが、そうではありません。しかし、これを確認するために、PureScript の型クラス階層を使用してみましょう。Applicative
Monad
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
の双対extract
とbind
の双対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
の観点から定義することはできず、extend
orの観点から/duplicate
を定義することもできないことに注意してください。したがって、これは「論理的な」ステップのように見えます。ここではほとんど関係ありません。の法則が成り立つ限り、またはのいずれかに対して定義できます。pure
return
bind
join
apply
Extract
Monad
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 に を持っているが を持っていない(またはを持っていない、以下を参照) 型があるかどうかは興味深いですが、それらはかなりまれだと思います。Applicative
Monad
Apply
Extract
Comonad
Extend
Comonad
Extract
まだ存在しないことに注意してください。しかし、どちらも2010 年のレポートApplicative
にはありませんでした。また、 andのインスタンスである型は、自動的に aと a の両方になります。これは、 andに関してandを定義できるためです。Extract
Applicative
Monad
Comonad
bind
extend
extract
pure
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 w
Monad
class (Applicative f, Bind f) => Monad f
Comonad
(Extend w, Extract w) => Comonad w