Haskell'deki Comonad tip sınıfı nedir?


105

Haskell'deki Comonad tip sınıfı nedir? Comonad paketindeki Control.Comonad'dan Comonad'da olduğu gibi (Comonad tip sınıfını sağlayan diğer paketlerin açıklamalarına da açığız). Komonad hakkında belirsiz bir şekilde duydum, ama gerçekten tek bildiğim, bunun Monad'lara extract :: w a -> abir çeşit paralellik sağladığı return :: a -> m a.

Comonad'ın "gerçek" kullanımlarını "gerçek" kodda belirtmek için bonus puanlar.


"Co" ve normal arasındaki farkın ne olduğunu gerçekten görmek isterim. Bir monadın ne olduğunu biliyorum. Yani "eş" kelimesinin ne anlama geldiğini bilirsem, kendime komonadın ne olduğu sonucuna varabilir ve onu derinden anlayabilirim. Alexey Romanov'un cevabı bu açıdan hiçbir şey yapmadı.
Evi1M4chine

2
@ Evi1M4chine: "co" (gevşek bir şekilde) "okları çevir" anlamına gelir. İşte bunun kaba bir görseli. Monadik işlemleri düşünün: return :: a ~> m a, flip bind :: (a ~> m b) -> (m a ~> m b). Dolambaçlı okları Ters ve comonadic operasyonları olsun: extract :: a <~ w a, extend :: (a <~ w b) -> (w a <~ w b)( extract :: w a -> a, extend :: (w a -> b) -> w a -> w b)
Dan Burton

Teşekkürler @Dan Burton… bu yüzden bir monad ile “içeride” (yeni ve değiştirilmiş şeyleri içeri doldururken), bir komonadla “dışarıda” çalışırsınız (nihayet bir şeyleri dışarı çıkarmak veya sadece onları değiştirmek için) . Bu görüş doğru mu? Çünkü derin anlayışa kesinlikle çok yardımcı oluyor.
Evi1M4chine

Komonadlar ortak etkileri modellemek için kullanılabilir. İşte katsayılara harika bir giriş: tomasp.net/coeffects
zeronone

Yanıtlar:


83

Bu bağlantılar yardımcı olabilir:

  1. Hücresel otomatayı değerlendirmek komiktir . Özellikle, "çok sayıda küçük ama benzer hesaplamalardan büyük veri yapılarının bir araya getirildiğini gördüğünüzde, bir komonad ile uğraşma ihtimalimiz yüksektir".
  2. Diziler, akışlar ve segmentler
  3. Günlük yaşamda komonadlar

1
+1 İlk bağlantı, onu benim için gerçekten bir araya getiren şeydi.
luqui

42
Yalnızca bağlantı yanıtında en azından bağlantılı içeriklerin bir özeti bulunmalıdır. Şu anda bu cevap iyi bir SO cevabı olmaya uygun değil. Bağlantılı makaleler olmadan kendi başına durabilmesi için onu biraz genişletmeyi düşünün.
Bakuriu

3
"Ne zaman çok sayıda küçük ama benzer hesaplamadan büyük veri yapılarının bir araya getirildiğini gördüğünüzde, bir komonad ile uğraşma şansımız yüksektir" .... Bu, parça gölgelendiricilerinin komonadik olduğu anlamına mı geliyor?
Sam Kellett

Bulduğum bu örneği bir extendyardımcı olmaktır.
Chris Penner

22

Bu sorumu tam olarak cevaplamıyor, ancak bazı alakalı bilgileri cevap formatına koymak istedim:

"co" (gevşek) "okları çevir" anlamına gelir. İşte bunun kaba bir görseli.

Monadik işlemleri düşünün:

return :: a ~> m a
flip (>>=) :: (a ~> m b) -> (m a ~> m b)

Dalgalı okları ters çevirin ve komonadik işlemleri elde edin:

extract :: a <~ w a
extend :: (a <~ w b) -> (w a <~ w b)

(Normal oklarla yazılmıştır)

extract :: w a -> a
extend :: (w a -> b) -> w a -> w b

Bildirim bu biçimde, nasıl returnsadece bu yüzden argümanı yuvasına uyacak şekilde gerçekleşen bir oktur flip (>>=)ve aynı doğrudur extractve extend. Monad / comonad yasaları , o yuvaya koyduğunuzda returnveya extractiçine koyduğunuzda sonucun kimlik oku olduğunu söyler. Yasalar aynıdır, "sadece oklar çevrildiğinde". Bu harika bir cevap ama umarım biraz fikir verir.


2
Cevabınız, monad öğretici yanlışlığından kaçınmakla iyi gidiyor. Monadlar (ve komonadlar) sadece bir arayüzdür. Yine de nasıl tasarlandıklarını bilmek gerçekten harika olurdu . Olduğu gibi: Arkasındaki fikir.
Evi1M4chine
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.