回答:
まず第一に:
モナドはすべて適用ファンクターであり、適用ファンクターはファンクターです。
これはHaskellの文脈では当てはまりApplicative
ますが、モナド(およびコナド)はエンドファンクターであるのに対し、異なるモノイダルカテゴリ間で「適用可能な」ファンクターを持つことができるというささいな理由で、一般的にはそうではありません(「強い緩いモノイダルファンクター」と読みます) 。
さらに、Applicative
名前(およびの型シグネチャ(<*>)
)を正当化するためには、モノイド構造と内部homの両方を保持する閉じたモノイドカテゴリ間でファンクターが必要になるため、強力な緩いモノイダルファンクターで識別することはわずかに誤解を招きます。これは、どちらかのプロパティを保持するモノイドの閉じたカテゴリー間のファンクターが明白な方法でもう一方を保持することを除いて、「緩い閉じたモノイドファンクター」ともっともらしい。ので上だけendofunctors説明Haskのmonoidal構造を維持し、そのインスタンスはその含め、自動的にプロパティの多くを獲得強ので省略さすることができ、。Applicative
(,)
との明らかな関係Monad
は、おそらく、Applicative
それぞれのモノイド構造の側面を一致させる暗黙の制限の成果物であり、残念ながら二重化を生き延びられない幸せな一致です。
カテゴリコモナがモナドであるように、oplaxのモニダルファンクタは、緩いモノイダルのファンクタです。しかし、はモノイダル閉ではなく、関数適用を含まないco- は名前にほとんど値しません。とにかく、結果はそれほど面白くありません: Applicative
class (Functor f) => CoMonoidal f where
counit :: f () -> ()
cozip :: f (a, b) -> (f a, f b)
代わりに、 "colax closed functor"の概念を想像できApplicative
ます。これは、存在する場合のように見えます。残念ながら、でなく、すべてのクローズドカテゴリ(私の知る限り):で射に対応でただし、内部のホームとしては機能しません。矢印が逆になっているため、代わりに何らかの補助機能が必要になります。これはに対して一般的に定義できません。newtype Op b a = Op (a -> b)
Op b a
oladsymbolに"colax閉じたファンクター"が存在し、さらにそれらが期待する方法で動作するように単純にふりをした場合、それに基づく共同ベースはおそらく次のようになります。Applicative
class (Functor f) => CoApplicative f where
copure :: f a -> a
coap :: (f a -> f b) -> f (a -> b)
に追加duplicate :: f a -> f (f a)
するcopure
と、当然、(法律が満たされていると仮定して)コモナドが生成されます。しかし、coap
それが何であれ-との間に明らかな関係はありませんextend :: (f a -> b) -> f a -> f b
。型を比較すると、二重化がさまざまな方法で発生していることが明らかになります。基礎duplicate
となるコノノイド構造は互いにまたcozip
はほとんど関係がありcoap
ません(おそらくおそらく意味をなさないでしょう)が、liftA2 (,)
and (<*>)
は同等であり、から派生することができますjoin
。
双対化のもう1つの可能な方法Applicative
は、コモナドとの関連性がさらに低いため、反変モニダルファンクターを考慮することです。
class (Contravariant f) => ContraMonoidal f where
contraunit :: f a
contrazip :: f a -> f b -> f (Either a b)
しかし、これは上記と同じ問題、つまりは閉じたカテゴリではないということです。それがあった場合、我々はいくつかのタイプだろうように我々は関数を書くことができるようにと、予想通りとなるように、実際に働いていたが。b <~ a
contracurry :: (Either c b <~ a) -> (c <~ (b <~ a))
contraapply :: b -> Either a (a <~ b)
記憶が私に役立つなら、ここでの障害はHaskellに特有のものではなく、むしろがデカルト閉である(もちろん通常の手を振るまで)ことから生じる。ほとんどの設定ではそれほど遠くないでしょう。CoApplicative
ただし、双対化により適したモノイドの閉じたカテゴリでは、より良い運があります。特に、私はKleisli (Cont r)
その両方とその反対のカテゴリーはモノイダル閉鎖であると信じているので、これらのアイデアを探求するためのより良いコンテキストかもしれません。
SOに関するこの投稿では、興味深い回答、つまり決定的なファンクターを見つけました。我々は交換した場合()
でVoid
、(,)
でEither
と矢印を逆に、我々が得ます:
class Functor f => Decisive f where
nogood :: f Void -> Void
orwell :: f (Either s t) -> Either (f s) (f t)
ブログの投稿には、決定的なファンクターが従ういくつかの法律も含まれています。
そして、すべてComonad
もDecisive
です:
instance Comonad c => Decisive c where
nogood = counit
orwell story = case counit story of
Left s -> fmap (either id (const s)) story
Right t -> fmap (either (const t) id) story
したがって、決定的なファンクターは、ファンクターとモナドの間に適合するファンクターと同じように、ファンクターとコマンドの間に収まります。
McBrideとPatterson(セクション7)は、イディオムとしても知られている適用ファンクターは、強力な緩いモノイダルファンクターであることを示しています。あなたは探している強いcolax monoidal数子としても知られている強力なoplax monoidal数子。コメントで述べたように、オプラックスモノイダルファンクターは、反対のカテゴリー間の緩いモノイダルファンクターであり、最終的には緩いモノイダルファンクターのコノノイドバージョンになります。
図を描き、矢印を逆にします!
それが何であるかを確認し、それを関数型プログラミングの概念に変換するために、私は少し時間をかけて詳細を練る必要がありました。