Comonad nedir ve nasıl faydalıdır?


16

Son zamanlarda Monad'ların nasıl çalıştığı konusundaki bilgilerimi körükledim. Ben de bir kavramı tanıtıldı oldum 'Comonad' olarak tarif edilir, ters bir monadın ikili . Ancak, kafamı etrafına sarmak imkansız.

Monad'ları anlamak için kendim için kendi benzetmesini yaptım:

Monadlar, 'ifadelerin konveyör bantlarını inşa etmek için bir plan' olarak görülebilir.

Yeni bir Monad (yeni bir konveyör bant sistemi) tanımlamak için şunları tanımlamanız gerekir:

  1. Bir taşıma bandına bir şey koymanın bir yolu, örneğin bir taşıma bandını 'başlatmak'. ( unitVeya olarak bilinirreturn )
  2. Bir taşıma bandının parçası olacak bir makineyi (bir ifade) bir taşıma bandına bağlamanın bir yolu. ( joinVeya bindveya olarak bilinir >>=).

(Mevcut konveyör bandını alan, içeriğini atan ve yeni bir konveyör bandını başlatan üçüncü bir işlem vardır >>, ancak çok nadiren kullanılır.)

Makinelerin ve konveyörlerin birlikte düzgün çalışması için şunlardan emin olmanız gerekir:

  1. Bir taşıma bandına bir şey koyar ve bir makineden geçirirseniz, çıktı makineden manuel olarak geçirdiğinizle aynı olmalıdır. (Sol Kimlik)
  2. Mevcut bir konveyör bandının arasına bir konveyör bant koymak istiyorsanız, üzerinde bir konveyör bant bulunan bir konveyör bant yerine daha uzun tek bir konveyör bant kullanmalısınız. (Doğru Kimlik)
  3. Makine A'yı manuel olarak kullandıktan sonra sonucu konveyöre bağlı BC'den geçirirseniz veya konveyöre bağlı AB kullanırsanız ve sonucu manuel olarak C'den geçirirseniz çıktı için önemli olmamalıdır. Başka bir deyişle: ((a >> = b) >> = c) (a >> = (b >> = c)) (İlişkilendirme) ile aynı olmalıdır

En basit konveyör bandı sadece girişi alan ve her zaman bir sonraki ifadeye devam eden konveyör bant olacaktır. Bir 'boru hattı' budur.

Başka bir olasılık, sadece değer için bir koşul sağlandığında bir sonraki makineden geçmesine izin vermektir. Bu, aradaki bazı ifadelerde, değerin artık izin verilmeyen bir şeye dönüşmesi durumunda, ifadelerin geri kalanının atlanacağı anlamına gelir. Haskell'de 'Belki' monad'ın yaptığı budur.

Değerleri bir makineye vermeden önce veya sonra başka süslü koşullu kopyalama / değiştirme kuralları da yapabilirsiniz. Bir örnek: ayrıştırıcılar (bir ekspresyon 'kusurlu' sonucu verir Burada, eğer, gelen değeri önce ifade çıkışı olarak kullanılır).

Tabii ki analoji mükemmel değil, ama umarım monadların nasıl çalıştığının iyi bir temsilini verir.

Ancak, Comonad'ları anlamak için bu benzetmeyi kafasına çevirmekte çok sorun yaşıyorum. İnternette bulduğum az miktarda bilgiden bir Comonad'ın tanımladığını biliyorum:

  • extract, Çeşit ters olan returnbir, bir değer alır üzerinden bir Comonad arasında.
  • duplicatetersi join, yani, tek birinden iki Comonad yaratır.

Ancak bir Comonad, yalnızca onlardan çıkarabiliyor veya çoğaltabiliyorsak nasıl somutlaştırılabilir? Ve aslında nasıl kullanılabilirler? Bu çok şaşırtıcı projeyi ve bununla ilgili konuşmayı gördüm (maalesef çok az anladım), ancak işlevselliğin hangi bölümünün bir Comonad tarafından tam olarak sağlandığından emin değilim.

Comonad nedir? Ne için yararlılar? Nasıl kullanılabilirler? Yenilebilir mi?


2
"Bir Comonad, yalnızca onlardan çıkarabiliyor veya çoğaltabiliyorsak nasıl somutlaştırılabilir?" - Sorunuzu bir soru ile cevaplayacağım: Bir Monad, yalnızca değerleri ve sıra hesaplamaları kaldırabiliyorsanız nasıl tüketilebilir?
Benjamin Hodgson

1
“Konveyör bandının sonundaki makine” (bir yana: Monadlar hakkında konuşurken faydalı olan her şeyi benzetmiyorum) IOmonad'ın çağrıldığı Haskell runtime sistemi main. Orada da unsafePerformIOtabii ki,. MaybeMonad'ı "taşıma bandının ucunda bir makine" olarak düşünmek istiyorsanız kullanabilirsiniz maybe.
Benjamin Hodgson

1
Ancak, açıklamayı tersine çevirerek, bir cobinduygulama zincirinin başlangıcında bir comonadik değer üretmek istediğinizde, comonad'ınızın iç temsili ile faydalı bir şey yapan bir işlev olmalıdır.
Benjamin Hodgson

2
comonad veya monad'ın belirli bir örneği, yalnızca typeclasses
jk

2
Bu Kategorilere ayrılmış teorik / matematiksel taraftan bu soruyu yaklaşım yoksa yararlı olacak, ama comonad ters ziyade olmadığını işaret etmek istediği değil o ikili bir monadın.
Jörg W Mittag

Yanıtlar:


11

Komonad, tıpkı bir monad gibi, kategori teorisindeki matematiksel bir yapıdır. Ko-öneki, koyduğunuzda "tersleri" belirtmek için çok yaygındır (her ne kadar saf matematikçilerin kelime seçiminde hemfikir olduğunu düşünmüyorum).

Kategori teorisinde categories , kısaca bu nesneler arasında objects(herhangi bir tür veya nitelikte, iç yapı ilgisiz) ve bazılarının bir koleksiyonu vardır arrows. Bir şeyin kategori olması için okların bazı yasalara (sol / sağ kimlik ve ilişkilendirilebilirlik) uyması gerekir, ancak bu gerçekten önemli değildir.

Şimdi, kategori teorisi hem çok soyut / hem de zor ve geniş. Her şeyden geçmek çok zaman alıyor (ve resmi olarak çalışmadım, sadece bazı temelleri biliyorum), ancak kullanılan bir kavram var.dual . Temel olarak, her kategori opposite categoryiçin aynı şeyi yaparak ama "tüm okları tersine çevirerek" bir yapı oluşturabilirsiniz. Bu çok naif bir tanım ama özetlemeye çalışmak zor. C kategorisindeki bir şeyin ikilisi temelde karşı kategorideki C_op ile aynı şeydir (henüz baş ağrısı mı çekiyor?)

Her neyse, bir kategori üzerinde bir monadınız varsa (ve bir kategori örneğin, nesnelerin bazı programlama dillerinde ve okların türler arasında işlevler olduğu bir kategori olabilir), o zaman bir comonad temel olarak aynı şeydir, sadece siz Tüm okları ters çevirdim (bu durumda işlev imzalarını tersine çevirmek gibi).

Erik Meijer ve Brian Beckman arasındaki bu tartışmada, ikilik kavramını ve Erik'in IEnumerable<T>C # 'da nasıl "okları tersine çevirme" konusunu tartıştığı daha fazla "uygulamalı" bir açıklama bulunabilir reaktif çerçevenin oluşturulması ve IObservable<T>(ki anlayabildiğim kadarıyla düzeltildiğim için, temelde bir liste comonad örneğidir).

Videoda adı geçen comonad'ların bir başka pratik örneği, .NET'teki türdür ( Task<T>burada Task<U> ContinueWith<U>(Func<Task<T>, U>)ikili bind(veya SelectManyC # olarak adlandırılır)


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.