2016-01-17 4 views
12

この式をXで解くことはできますか?適用はモナドに何がXをコモナドにするか

のApplicativeは、Xはそれをいくつかの考えを与えた後

+3

'ComonadApplyはMonadに適用されるようなComonadになります。' http://hackage.haskell.org/package/comonad-4.2.7.2/docs/Control-Comonad.html#t:ComonadApply Applicativeと大きく違う... – danidiaz

+1

は答えのように聞こえる! – nicolas

+3

@danidiaz「ComonadApply」は、「Monad」である必要はない「Applonative」とは異なり、Comonadでなければならないことがわかります。これは私の主な違いと思われます。 – chi

答えて

5

をcomonadすることが何であるかをモナドすることで、私は、これは実際に後方質問だと思います。 ComonadApplyComonadになると思うかもしれませんが、ApplicativeMonadになりますが、そうではありません。 ComonadApplyは単に(Apply w, Comonad w) => wで、あなたが見ることができるように

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 

:しかし、これを見て、私たちはPureScriptの型クラス階層を使用してみましょう。しかしApplicativeの値をpureでファンクタに注入するのは本当の違いです。

カテゴリデュアルとしてComonadの定義はreturnで構成のデュアルextractbindのデュアルextend(または経由代替definiton 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 

MonadApplicativeからステップを見て、間の論理的なステップは、デュアル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 
0123我々は extendduplicateの面で extractを定義することはできませんし、どちらも私たちは bindjoinの面で pure/ returnを定義することはできませんので、これは「論理的」ステップのように思える

注意。 applyはここではほとんど無関係です。限り、彼らの法則が成り立つよう、ExtractMonadのいずれかのために定義することができます。

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(値を得ることが)MonadComonadApplicative(の値を取得)にしているです。 Applyは多かれ少なかれ幸せな小さな事故です。 HaskにはExtractの型がありますが、Comonad(またはExtendではなく、Comonadではありません)という型があるのは興味深いでしょうが、それらはかなり珍しいと思います。

Extractはまだ存在しません—です。しかし、どちらものApplicativeはありませんでした。あなたはextractpureの面でbindextendを定義することができますので、また、自動的にExtractのインスタンスとApplicativeの両方で任意のタイプは、両方のMonadComonadです:

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がより実現可能である可能性がありますが、Monadclass (Applicative f, Bind f) => Monad fに分割してComonad(Extend w, Extract w) => Comonad wに分割する可能性があるので、多かれ少なかれ分割しています。

関連する問題