Biarkan menjadi CCC . Mari menjadi bifunctor produk pada . Karena Cat adalah CCC, kita dapat menjilat :
Kategori memiliki struktur monoid biasa. Sebuah monoid di adalah monad di . Kami mempertimbangkan produk yang terbatas sebagai struktur monoidal di .
Oleh karena itu mempertahankan struktur monoid, sehingga mengangkut monoid ke monad dan komonoid ke comonad. Yaitu, mengangkut sebuah monoid sewenang-wenang ke monad (lihat definisi - harus monoid a). Demikian pula itu mengangkut comonoid diagonal ke comonad Coreader.
Sekarang, untuk konkret, saya membuka konstruksi Penulis.
Mulai. Sebenarnya , mereka hanya memiliki nama yang berbeda di Haskell. Kami memiliki monoid :
Writer adalah functor, jadi ia harus memetakan juga morfisme, seperti dan . Saya menulis ini seperti di bawah ini, meskipun tidak valid di Haskell:
adalah transformasi alami, morphism di . Dengan sifat itu adalah fungsi, yang mengambil dan memberikan morfisme dalam :
Secara informal, menjumlahkan komponen tipe dan memompakan utuh. Ini persis definisi Writer di Haskell. Satu kendala adalah bahwa untuk monad kita butuhkan
yaitu ketidakcocokan jenis. Tetapi fungsi-fungsi ini isomorfis: oleh associator biasa untuk produk hingga yang merupakan isomorfisme alami . Kemudian kita mendefinisikan melalui . Saya menghilangkan konstruksi melalui .
Writer, sebagai functor, mempertahankan diagram komutatif, yaitu mempertahankan persamaan monoid, jadi kami telah memberikan persamaan yang terbukti untuk = monoid dalam = sebuah monad di . Akhir.
Bagaimana dengan Reader dan Cowriter? Pembaca disatukan dengan Coreader, seperti yang dijelaskan dalam definisi Coreader, lihat tautan di atas. Demikian pula, Cowriter adalah tambahan untuk Writer. Saya tidak menemukan definisi Cowriter, jadi saya mengarangnya dengan analogi seperti pada tabel:
{- 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')))
Di bawah ini adalah definisi yang disederhanakan dari monad tersebut. fr_ob F menunjukkan pemetaan functor F pada objek, fr_mor F menunjukkan pemetaan functor F pada morfisme. Ada objek monoid di .
- Penulis
- Pembaca
- Coreader
- Penulis
Pertanyaannya adalah bahwa tambahan di berhubungan dengan functors, bukan monads. Saya tidak melihat bagaimana susunannya menyiratkan "Coreader is a comonad" "Reader is a monad" dan "Writer is a monad" "Cowriter is a comonad".
Ucapan. Saya berjuang untuk memberikan lebih banyak konteks. Itu membutuhkan pekerjaan. Terutama, jika Anda memerlukan kemurnian kategori dan mereka (co) monad diperkenalkan untuk programmer. Terus mengomel! ;)