Fermuar'ın neden Comonad olduğunu anlamak


112

Bu, önceki sorumun cevabının devamı niteliğindedir.

Ben her öğeyi eşleştirmeniz gerekir varsayalım a:Aarasında List[A]hiç b:Bfonksiyonu ile def f(a:A, leftNeighbors:List[A]): Bve üretmek List[B].

Açıkçası sadece maplisteden arayamam ama liste fermuarını kullanabilirim . Fermuar, bir listede hareket etmek için kullanılan bir imleçtir. Geçerli öğeye ( focus) ve komşularına erişim sağlar .

Şimdi benim yerini alabilir file def f'(z:Zipper[A]):B = f(z.focus, z.left)ve bu yeni işlevi geçmesi f'için cobindyöntemiyle Zipper[A].

cobindBöyle eserler: o çağrıları f'fermuarla sonra fermuarı taşır, çağrılar f'ile yeni "taşındı" fermuar, yine vb, vb fermuar hamle ... fermuar listenin sonuna ulaşıncaya kadar.

Son olarak, listeye dönüştürülebilen cobindyeni bir fermuar türü döndürür Zipper[B]ve böylece sorun çözülür.

Şimdi cobind[A](f:Zipper[A] => B):Zipper[B]ve arasındaki simetriye dikkat edin. bind[A](f:A => List[B]):List[B]Bu yüzden Lista Monadve Zippera'dır Comonad.

Mantıklı geliyor ?


1
Uzman değilim ama bu bana mantıklı geliyor. Açıklamanızı okurken bir aydınlanma yaşadım. Teşekkürler!
acjay

7
Sorunuzu SO formatında yanıtlamak çok zor ... ama kesinlikle haklısınız. Öğe odaklı Fermuarlar her zaman komonadlardır.
J. Abrahamson

4
Liste aynı zamanda bir komonad olarak da görülebilir (birden çok şekilde), bir Fermuar bir monad olarak kullanılabilir (ayrıca birçok şekilde). Aradaki fark, kavramsal olarak veriyi bir durum makinesine yapıcı bir şekilde "eklemeye" (Monad arayüzü bununla ilgili) veya ondan "yapısökümcü bir şekilde" durumu "ayıklamaya" (Comonad'ın yaptığı şey) odaklanıp odaklanmadığınızdır. Ancak "bu anlayış mantıklı mı?" Sorusuna cevap vermek kolay değil. Bir anlamda öyle, başka bir anlamda yapmıyor.
KT.

2
Bir şeyi bir komonad'a çevirmek için iki işlem sağlamanız gerekir: 1) Bir değerin çıkarılması (örneğin, listenin başı olabilir) ve 2) Bir liste işleme işleminin uygulanması (örn. uygun bir birim dönüşümünün listeyi değiştirmeyeceğini varsayarsak, liste boyunca veya eleman bazında veya benzeri bir şekilde pencere tarzında). Bir listeyi bu şekilde işlemenin herhangi bir mantıklı olup olmadığı ayrı bir konudur. Çıplak bir comonad arayüzünün ne listeyi inşa etmek ne de çapraz geçiş yapmak için bir yol sağlamadığını unutmayın. Yalnızca listeye duyarlı işlemlerin nasıl kullanılacağını bilir.
KT.

2
@eenblam Haklısın. Bir cevap ekleyeceğim ve bu soruyu cevapsızlar listesinden çıkaracak, umarım
Michael

Yanıtlar:


1

Bu soru düzenli olarak "cevaplanmayanlar" listesinin başında belirdiğinden, yorumumu burada bir cevap olarak kopyalayayım - zaten bir yıldan bu yana çok daha yapıcı hiçbir şey ortaya çıkmadı.

A Listaynı zamanda bir komonad olarak görülebilir (birden fazla şekilde), a ise Zipperbir monad olarak kullanılabilir (ayrıca birçok yönden). Aradaki fark, kavramsal olarak veriyi bir durum makinesine yapıcı bir şekilde "eklemeye" ( Monadarayüzün bununla ilgili) veya ondan "yapısökümcü bir şekilde" durumu "çıkarmaya" odaklanıp odaklanmadığınızdır (olan budur Comonad).

Ancak "bu anlayış mantıklı mı?" Sorusuna cevap vermek kolay değil. Bir anlamda öyle, başka bir anlamda yapmıyor.

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.