Bu, önceki sorumun cevabının devamı niteliğindedir.
Ben her öğeyi eşleştirmeniz gerekir varsayalım a:A
arasında List[A]
hiç b:B
fonksiyonu ile def f(a:A, leftNeighbors:List[A]): B
ve üretmek List[B]
.
Açıkçası sadece map
listeden 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 f
ile def f'(z:Zipper[A]):B = f(z.focus, z.left)
ve bu yeni işlevi geçmesi f'
için cobind
yöntemiyle Zipper[A]
.
cobind
Bö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 cobind
yeni 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 List
a Monad
ve Zipper
a'dır Comonad
.
Mantıklı geliyor ?