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 ?