答えて
をcomonadすることが何であるかをモナドすることで、私は、これは実際に後方質問だと思います。 ComonadApply
はComonad
になると思うかもしれませんが、Applicative
はMonad
になりますが、そうではありません。 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
で構成のデュアルextract
とbind
のデュアル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
Monad
にApplicative
からステップを見て、間の論理的なステップは、デュアル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我々は
extend
か
duplicate
の面で
extract
を定義することはできませんし、どちらも私たちは
bind
か
join
の面で
pure
/
return
を定義することはできませんので、これは「論理的」ステップのように思える
注意。 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
(値を得ることが)Monad
へComonad
何Applicative
(の値を取得)にしているです。 Apply
は多かれ少なかれ幸せな小さな事故です。 HaskにはExtract
の型がありますが、Comonad
(またはExtend
ではなく、Comonad
ではありません)という型があるのは興味深いでしょうが、それらはかなり珍しいと思います。
Extract
はまだ存在しません—です。しかし、どちらものApplicative
はありませんでした。あなたはextract
とpure
の面でbind
とextend
を定義することができますので、また、自動的にExtract
のインスタンスとApplicative
の両方で任意のタイプは、両方のMonad
とComonad
です:
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
に分割する可能性があるので、多かれ少なかれ分割しています。
- 1. モナドはコモナドにできますか?
- 2. IOモナド内のモナドを使用する
- 3. Mac OS Xに最適なSubversionクライアントは何ですか?
- 4. モナドをきれいにする - モナド変圧器を新しいタイプのモナドに応用すること
- 5. [x]の代わりにoperator.itemgetter(x)を使用する理由は何ですか?
- 6. トラバース可能なモナドの構成は常にモナドですか?
- 7. モナド変圧器はサービスからJSONを取得するために適用されますか?
- 8. 実際にフィルタを適用するのは何ですか?
- 9. オブジェクトにsコマンドを適用する適切な方法は何ですか?
- 10. eclipse 3.x RCPでCSSスタイルを適用するには?
- 11. 何が-webkit-transformですか:translate3d(0,0,0);正確には?身体に適用する?
- 12. 選択モナドが応用モナドであることをCoq証明する
- 13. DDD:ドメインに入ると何が適用されますか?
- 14. LINQが提供するコンポジションにモナドが参加するための最小限の要件は何ですか?
- 15. サーバに使用する適切なユーザエージェントは何ですか?
- 16. ユニットファンクタ/モナドを持つHaskellパッケージは何ですか?
- 17. C#開発者がモナドとは何かを理解するのに役立ちますか?
- 18. (x!= n)の代わりに(x < n || x > n)を使用する点は何ですか?
- 19. C++とCMakeに適用される定義は何ですか?
- 20. ラムダ式のパラメータについて、モナドに渡すことが証明できるものは何ですか?
- 21. FBMemoryProfilerをcocos2d-x iOsゲームにどのように適用するのですか?
- 22. xとyの長さが適用時に異なる
- 23. chart js - 各x軸ラベルに異なる色を適用する
- 24. 2つのモナド変圧器の違いは何ですか?
- 25. Option以外の標準のScalaモナドは何ですか?
- 26. モナドの命名規則は何ですか?
- 27. fmapのモナド "バージョン"の名前は何ですか?
- 28. 制限付きモナドの現在の状況は何ですか?
- 29. MaybeTモナドには何もない:より簡潔な方法?
- 30. ["x"!= x]がbashで何をするのですか?
'ComonadApplyはMonadに適用されるようなComonadになります。' http://hackage.haskell.org/package/comonad-4.2.7.2/docs/Control-Comonad.html#t:ComonadApply Applicativeと大きく違う... – danidiaz
は答えのように聞こえる! – nicolas
@danidiaz「ComonadApply」は、「Monad」である必要はない「Applonative」とは異なり、Comonadでなければならないことがわかります。これは私の主な違いと思われます。 – chi