Pembaca, Penulis monads

17

Biarkan menjadi CCC . Mari menjadi bifunctor produk pada . Karena Cat adalah CCC, kita dapat menjilat :C(×)C(×)

curry(×):C(CC)

curry(×)A=λB.A×B

Kategori memiliki struktur monoid biasa. CC Sebuah monoid di adalah monad di . CCC Kami mempertimbangkan produk yang terbatas sebagai struktur monoidal di .C

curry(×)1id

A B.curry(×)(A×B)(curry(×)A)(curry(×)B)

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.(curry(×))w(Writer w)w

Sekarang, untuk konkret, saya membuka konstruksi Penulis.

Mulai. Sebenarnya , mereka hanya memiliki nama yang berbeda di Haskell. Kami memiliki monoid :Writer=Coreader=curry(×) w,mappend,mempty

mappend:w×ww

mempty:1w

Writer adalah functor, jadi ia harus memetakan juga morfisme, seperti dan . Saya menulis ini seperti di bawah ini, meskipun tidak valid di Haskell:mappendmempty

Writer mappend:Writer(w×w)Writer w

Writer mappend adalah transformasi alami, morphism di . Dengan sifat itu adalah fungsi, yang mengambil dan memberikan morfisme dalam :CCcurry(×)aOb(C)C

Writer mappend a=mappend×(id(a)):Writer(w×w)aWriter w a

Secara informal, menjumlahkan komponen tipe dan memompakan utuh. Ini persis definisi Writer di Haskell. Satu kendala adalah bahwa untuk monad kita butuhkanWriter mappend awaWriter w,μ,η

μ:Writer wWriter wWriter w

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(w×w)=λa.(w×w)×aλa.w×(w×a)=Writer wWriter wμWriter mappendηmempty

Writer, sebagai functor, mempertahankan diagram komutatif, yaitu mempertahankan persamaan monoid, jadi kami telah memberikan persamaan yang terbukti untuk = monoid dalam = sebuah monad di . Akhir.Writer w,μ,η(CC)C

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:

teks alternatif

{- 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 .w,+^,0^C

  • Penulis
    • fr_ob(Writer w)a=a×w
    • fr_mor(Writer w)f=λa0,w2.a0,f w2
    • ηa=λa0.a0,0^
    • μa=λa0,w1,w0.a0,w0+^w1
  • Pembaca
    • fr_ob(Reader r)a=ra
    • fr_mor(Reader r)f=λg r0.f(g r0)
    • ηa=λa0 r0.a0
    • μa=λf r0.f r0 r0
  • Coreader
    • fr_ob(Coreader r)a=r×a
    • fr_mor(Coreader r)f=λr0,a0.f r0,a0
    • ηa=λr0,a0.a0
    • μa=λr0,a0.r0,r0,a0
  • Penulis
    • fr_ob(Cowriter w)a=wa
    • fr_mor(Cowriter w)f=λg r0.f(g r0)
    • ηa=λf.f 0^
    • μa=λf w1w0.f(w0+^w1)

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".C

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! ;)

beroal
sumber
Penawaran: Anda dapat mengambil tangkapan layar dari tabel, dan meletakkan gambar di sini.
MS Dousti
Anda harus menyalin pertanyaan di sini.
Dave Clarke
2
orang yang downvoting harus memposting komentar yang menjelaskan alasannya.
Suresh Venkat
1
@Ohad. Saya mengakui bahwa saya memperkenalkan perubahan itu untuk mencoba memberikan pertanyaan dengan konteks yang lebih banyak (seperti yang awalnya ditemukan dalam posting blog yang direferensikan). Saya pikir beroal harus menghabiskan lebih banyak upaya untuk membuat pertanyaannya mandiri, misalnya, dengan mendefinisikan apa Reader dan Penulis dan Coreader dan Cowriter dalam istilah kategorikal atau dalam Haskell atau keduanya, daripada berasumsi bahwa kita semua tahu apa yang dimaksud.
Dave Clarke
2
@beroal: Apa yang saya maksudkan adalah, karena saya tidak menggunakan Haskell setiap hari, mem-parsing kode Haskell dan membuat transisi ke CT adalah hal yang tidak sepele bagi saya, dan mungkin yang lain. Dengan mengulangi pertanyaan dalam istilah yang murni kategorikal, Anda lebih mungkin menerima jawaban lebih cepat ...
Ohad Kammar

Jawaban:

13

Ya, jika monad memiliki adjoin kanan N , maka N secara otomatis mewarisi struktur comonad.M:CCNN

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 )CDFun(C,D)CDFunL(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 .CDFR:DCF:CDR:FunL(C,D)Fun(D,C)α:FGαR:GRFR

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=DFun(C,C)FunL(C,D)(FG)R=GRFRRRM

Reid Barton
sumber
1
Dan orang harus menyebutkan bahwa beberapa functors ini, misalnya bukan benar-benar functor melainkan sesuatu seperti pseudo-functor karena biasanya memenuhi functoriality hanya hingga isomorfisma kanonik. Meskipun demikian, poin utama adalah valid. R
Andrej Bauer
7

Omong-omong, ini:

Mari menjadi bifunctor produk di C . Karena C adalah CCC, kita dapat menjilat ( × )(×)CC(×)

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:CCat

HomCat(C×D,E)HomCat(C,ED)

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×DEDF:DECDEC=D=E

c u r r y × : C C C

×:C×CC
curry×:CCC

Tetapi ini hanyalah kasus khusus dari:

c u r r y F : C E D

F:C×DE
curryF:CED
Dan Doel
sumber
2 Dan Doel: Ya, ya, ya, terima kasih. Saya melakukan kesalahan saat menerjemahkan dari pos asli beroal.livejournal.com/23223.html .
beroal
4

F,G,ϵ,ηGF,η,GϵFFG,ϵ,FηGFGSetMon).

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.

:hom(×A,=)hom(,=A)X,Y. {f:X×AY}{f:XYA}:hom(×A,=×1)hom(1,=A)

wren romano
sumber
2 minggu kemudian: Saya tidak mengetahui adanya definisi yang menentukan untuk Reader dan Writer yang mirip dengan tambahan antara Set dan kategori struktur aljabar. Atau maksud Anda bahwa setiap monad didefinisikan oleh sebuah adjuncuatif seperti pada "MacLane. Kategori untuk Matematika yang Bekerja. VI. Monad dan Aljabar. 2. Aljabar untuk Monad. Teorema 1 (Setiap monad didefinisikan oleh T-algebrasnya). "? Bisakah Anda lebih spesifik? Sebenarnya pertanyaan saya adalah kesimpulan dari upaya untuk mendefinisikan mereka (co) monad dengan kata-kata yang elegan seperti daftar monad.
beroal
T
F:SetMonU:MonSetη:idSetUFϵ:FUidMonF,U,η,ϵUF,η,UϵFSetMonFU,ϵ,FηU
Functors (Reader a) dan (Writer a) adalah adjoint, dan adjunction tersebut memunculkan monad (State a).
beroal
"Tidak, maksud saya adalah bahwa monad dan comonad muncul dalam" dengan cara yang sama ", yaitu melalui adjunction, seperti yang dijelaskan di atas". Jika Anda mendapatkan monad dan comonad dari persimpangan antara kategori Set dan Mon, Anda mendapatkan monad pada Set dan comonad pada Mon - kategori yang berbeda. Tetapi Reader dan Writer berada pada kategori CCC yang sama.
beroal