してみましょうあることCCC。してみましょうの製品bifunctorも。通り猫が CCCである、我々はカレーできる:
ファンクターカテゴリは、通常のモノイダル構造があります。 でモノイド中モナドである。 有限積をモノイド構造と見なします。
したがって、はモノイド構造を保持するため、モノイドにモノイドを、コモノイドをコモナに輸送します。つまり、任意のモノイドをモナドに転送します(定義を見てくださいはモノイドでなければなりません)。同様に、それは輸送対角線comonoidにCoreaderの comonadを。w (W r i t e r w ) w
さて、具体性のために、Writerの構築を展開します。
ベギン。実際には、Haskellでは単に異なる名前を持っています。我々は持っているHaskellはモノイド:
ライターはファンクターなので、やなどの射もマップする必要があります。Haskellでは無効ですが、次のように記述します。m e m p t y
は自然な変換であり、射である。プロパティにより、それは関数でありを取り射を与えます:C U R R Y (× )A ∈ O B (C )C
非公式には、は、タイプコンポーネントを合計しそのままポンプます。これはまさにHaskellのWriterの定義です。1つの障害は、モナドに必要なことですw a
すなわち、型の非互換性。しかし、これらのファンクターは同型です: a自然な同型である有限積の通常のアソシエー。次に、を定義します。私は建設省略経由。≅ λ A 。W × (W × A )= W R I T E R W ∘ W R I T E R W μ W R I T E R M A P P Eη M 、E 、M 、P 、T 、Y
ライターはファンクターであり、可換図を保存します。つまり、モノイド等式を保存します。したがって、 =のモノイドを =モナドの。終わり。(C ⇒ C )C
何についてのリーダーとCowriter?Coreaderの定義で説明されているように、リーダーはCoreaderに付随しています。上記のリンクを参照してください。同様に、CowriterはWriterに付随しています。Cowriterの定義が見つからなかったので、表に示す類推でそれを作り上げました。
{- base, Hackage.category-extras -}
import Control.Comonad
import Data.Monoid
data Cowriter w a = Cowriter (w -> a)
instance Functor (Cowriter w) where
fmap f (Cowriter g) = Cowriter (f . g)
instance Monoid w => Copointed (Cowriter w) where
extract (Cowriter g) = g mempty
instance Monoid w => Comonad (Cowriter w) where
duplicate (Cowriter g) = Cowriter
(\w' -> Cowriter (\w -> g (w `mappend` w')))
以下は、それらの(コ)モナドの簡略化された定義です。fr_ob Fはオブジェクト上のファンクターFのマッピングを示し、fr_mor Fは射型上のファンクターFのマッピングを示します。はモノイドオブジェクトがあります。C
- 作家
- 読者
- コリーダー
- コライター
問題は、の付属語がモナドではなくファンクターに関連していることです。「Coreader is comonad」「Reader is a monad 」および「Writer is a monad 」「Cowriter is comonad」という付属語の意味がわかりません。
リマーク。より多くのコンテキストを提供するのに苦労しています。いくつかの作業が必要です。特に、カテゴリーの純度が必要な場合、それらの(コ)モナドはプログラマーに導入されました。しつこい!;)