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! ;)
Jawaban:
Ya, jika monad memiliki adjoin kanan N , maka N secara otomatis mewarisi struktur comonad.M:C→C N N
Pengaturan kategori-teori umum untuk memahami ini adalah sebagai berikut. Biarkan dan D menjadi dua kategori. Tulis F u n ( C , D ) untuk kategori fungsi dari C ke D ; Objek-objeknya adalah functors dan transformasi-transformasi morfismenya yang alami. Tulis F u n L ( C , D ) untuk subkategori lengkap F u n ( C , D )C D Fun(C,D) C D FunL(C,D) Fun(C,D) pada functors yang memiliki adjoin kanan (dengan kata lain, kami menganggap functors dengan adjoin kanan dan transformasi sewenang-wenang alami di antara mereka). Menulis untuk adjoint kanan functor . Kemudian adalah functor kontravarian: jika adalah transformasi alami maka ada diinduksi alami transformasi .C→D FR:D→C F:C→D −R:FunL(C,D)→Fun(D,C) α:F→G αR:GR→FR
Jika , maka memiliki struktur monoid yang diberikan oleh komposisi dan demikian pula , karena komposisi adjoin kiri adalah adjoin kiri. Secara khusus, , jadi adalah functor kontravarian antimonoid. Jika Anda menerapkan pada transformasi alami struktural yang melengkapi fungsi dengan struktur monad, apa yang Anda dapatkan adalah sebuah comonad.C=D Fun(C,C) FunL(C,D) (FG)R=GRFR −R −R M
sumber
Omong-omong, ini:
sedikit salah. Untuk satu, terminologi biasa akan (jika saya tidak salah) yang adalah bifunctor lebih atau C . "In" biasanya berarti konstruksi yang menggunakan panah dan objek dari suatu kategori, sedangkan kategori functors "on" merujuk pada konstruksi yang berhubungan dengan banyak kategori. Dan bifunctor produk bukanlah konstruksi dalam kategori Cartesian.× C
Dan ini berkaitan dengan ketidakakuratan yang lebih besar: kemampuan untuk menjilat produk bifunctor tidak ada hubungannya dengan karena Cartesian ditutup. Sebaliknya, itu mungkin karena C a t , kategori kategori (masukkan peringatan) adalah Cartesian ditutup. Jadi kari yang dimaksud diberikan oleh:C Cat
di mana adalah produk dari kategori, dan E D adalah kategori functors F : D → E . Ini berfungsi terlepas dari apakah C , D dan E tertutup Cartesian. Ketika kita membiarkan C = D = E , kita mendapatkan:C×D ED F:D→E C D E C=D=E
c u r r y × : C → C C
Tetapi ini hanyalah kasus khusus dari:
c u r r y F : C → E D
sumber
Jadi, apa yang ingin Anda lakukan adalah mengambil Reader (atau Writer) dan menguraikannya ke dalam adjoint functors yang menimbulkan monad dan comonad yang sesuai. Artinya, hubungan antara Reader dan Coreader (atau Writer dan Cowriter) bukan yang Anda cari.
sumber