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:
- Bir taşıma bandına bir şey koymanın bir yolu, örneğin bir taşıma bandını 'başlatmak'. (
unit
Veya olarak bilinirreturn
)- Bir taşıma bandının parçası olacak bir makineyi (bir ifade) bir taşıma bandına bağlamanın bir yolu. (
join
Veyabind
veya 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:
- 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)
- 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)
- 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 olanreturn
bir, bir değer alır üzerinden bir Comonad arasında.duplicate
tersijoin
, 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?
IO
monad'ın çağrıldığı Haskell runtime sistemi main
. Orada da unsafePerformIO
tabii ki,. Maybe
Monad'ı "taşıma bandının ucunda bir makine" olarak düşünmek istiyorsanız kullanabilirsiniz maybe
.
cobind
uygulama 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.