Monad apa pun juga merupakan fungsi aplikasi dan fungsi aplikasi apa pun adalah fungsi. Juga, comonad apa pun adalah functor. Apakah ada konsep yang sama antara comonads dan functors, sesuatu seperti functor co-aplikatif, dan apa propertinya?
Pembaruan: Saya juga tertarik dengan kemungkinan penggunaan konsep semacam itu.
ct.category-theory
monad
applicative
comonad
Petr Pudlák
sumber
sumber
Jawaban:
Pertama-tama:
Ini benar dalam konteks Haskell, tetapi (membaca
Applicative
sebagai "lax monoidal functor kuat") tidak secara umum, untuk alasan yang agak sepele bahwa Anda dapat memiliki "aplikator" functors antara kategori monoidal yang berbeda, sedangkan monads (dan comonads) adalah endofunctors .Selanjutnya, mengidentifikasi
Applicative
dengan functor monoid longgar lemah adalah sedikit menyesatkan, karena untuk membenarkan nama (dan jenis tanda tangan(<*>)
) memerlukan functor antara kategori monoid tertutup yang mempertahankan struktur monoid dan hom internal . Hal ini dapat secara masuk akal disebut sebagai "functor monoid tertutup lemah", kecuali bahwa functor antara kategori tertutup monoid yang mempertahankan salah satu properti mempertahankan yang lain dengan cara yang jelas . KarenaApplicative
menjelaskan hanya endofunctor pada Hask yang melestarikan struktur monoid, instansnya(,)
memperoleh banyak properti secara otomatis, termasuk kekuatannya , yang dengan demikian dapat dielakkan.Hubungan yang jelas dengan
Monad
ini bisa dibilang artefak dari batasan implisit padaApplicative
menyebabkan aspek dari struktur monoid masing-masing bertepatan, suatu kebetulan bahagia yang sayangnya tidak bertahan dualisasi.Hanya sebagai comonad pada kategori adalah monad di C o p , sebuah oplax monoidal functor C → D adalah longgar monoidal functor C o p → D o p . Tetapi tidak tertutup secara monoid , dan sebuah co- yang tidak menyertakan aplikasi fungsi hampir tidak pantas untuk namanya. Bagaimanapun, hasilnya tidak akan terlalu menarik:C Co hlm C→ D Co hlm→ Do hlm Ha s ko hlm
Applicative
Kita malah bisa membayangkan gagasan "colax closed functor", yang akan terlihat jauh lebih sepertiHa s ko hlm Ha s k b → a Ha s ko hlm Ha s k
Applicative
jika ada. Sayangnya, sama sekali tidak (menurut sepengetahuan saya) kategori tertutup sama sekali: di sesuai dengan morfisme di , tetapi tidak berfungsi sebagai hom internal di sana - karena panah dibalik, semacam fungsi bersama akan diperlukan sebagai gantinya, yang kami tidak dapat mendefinisikan secara umum untuk .newtype Op b a = Op (a -> b)
Op b a
Jika kita hanya berpura-pura bahwa "colax closed functors" ada untuk , dan selanjutnya bekerja dengan cara yang kita harapkan dengan naif, sebuah co- based yang mungkin akan terlihat seperti ini:Ha s k
Applicative
Menambahkan
duplicate :: f a -> f (f a)
kecopure
akan menghasilkan comonad (dengan asumsi hukum puas), tentu saja. Tapi tidak ada hubungan yang jelas antara - apacoap
pun itu - danextend :: (f a -> b) -> f a -> f b
. Membandingkan tipe-tipe itu menjadi jelas bahwa dualisasi terjadi dengan cara yang berbeda: struktur comonoidal yang mendasariduplicate
dancozip
tidak ada hubungannya dengan satu sama lain atau dengancoap
(yang mungkin tidak masuk akal juga), sedangkanliftA2 (,)
dan(<*>)
adalah setara dan dapat diturunkan darijoin
.Cara lain yang memungkinkan
Applicative
untuk melakukan dualisasi, yang lebih sedikit hubungannya dengan comonads, adalah dengan mempertimbangkan fungsi-fungsi monoid yang kontravarian:Tetapi ini bertabrakan dengan masalah yang sama seperti di atas, yaitu bahwa bukan kategori tertutup. Jika ya, kita akan memiliki beberapa jenis sehingga kita dapat menulis fungsi seperti dan dan seterusnya yang benar-benar berfungsi seperti yang diharapkan.Ha s ko hlm
b <~ a
contracurry :: (Either c b <~ a) -> (c <~ (b <~ a))
contraapply :: b -> Either a (a <~ b)
Jika ingatanku, kendala di sini tidak spesifik untuk Haskell, tetapi lebih muncul dari menjadi cartesian ditutup (tentu saja dengan melambaikan tangan,), properti yang dibagikan dengan kalkulus lambda yang paling diketik, jadi Anda tidak akan terlalu jauh dengan di sebagian besar pengaturan.Ha s k
CoApplicative
Namun, dalam kategori tertutup monoid yang lebih ramah terhadap dualisasi, Anda mungkin lebih beruntung. Secara khusus, saya percaya keduanya
Kleisli (Cont r)
dan kategorinya yang berlawanan tertutup rapat, sehingga mungkin merupakan konteks yang lebih baik untuk mengeksplorasi ide-ide ini.sumber
Dalam posting ini di SO saya menemukan jawaban yang menarik - penentu fungsi . Jika kita ganti
()
denganVoid
,(,)
denganEither
dan membalikkan panah, kita mendapatkan:Posting blog juga memberikan beberapa undang-undang yang mematuhi fungsi.
Dan, setiap orang
Comonad
jugaDecisive
:Jadi functors yang tepat cocok di antara functors dan comonads, seperti halnya functors aplikatif yang cocok antara functors dan monads.
sumber
McBride dan Patterson (Bagian 7) menunjukkan bahwa functor aplikatif, juga dikenal sebagai idiom, adalah functor monoid longgar yang kuat . Anda mencari functor monoid koloid yang kuat juga dikenal sebagai functor monoidal oplax yang kuat . Seperti disebutkan dalam komentar, sebuah oplax monoidal functor adalah lax monoidal functor antara kategori yang berlawanan, yang akhirnya menjadi versi comonoidal dari lax monoidal functor.
Gambar diagram, balikkan panah!
Saya harus meluangkan sedikit waktu untuk mengerjakan perincian untuk melihat mana itu, dan menerjemahkannya menjadi gagasan pemrograman fungsional.
sumber