这是我上一个问题的答案的后续。
假设我需要将每个项目映射到a:A
函数并生成。List[A]
b:B
def f(a:A, leftNeighbors:List[A]): B
List[B]
显然我不能只调用map
列表,但我可以使用列表拉链。拉链是在列表中移动的光标。它提供对当前元素 ( focus
) 及其邻居的访问。
现在我可以替换 myf
并将 def f'(z:Zipper[A]):B = f(z.focus, z.left)
这个新函数传递f'
给cobind
.Zipper[A]
像这样的cobind
工作:它f'
用拉链调用它,然后移动拉链,f'
用新的“移动”拉链调用,再次移动拉链,依此类推......直到拉链到达列表的末尾。
最后,cobind
返回一个新的 zipper 类型Zipper[B]
,可以转换为列表,这样问题就解决了。
现在注意和之间的对称性cobind[A](f:Zipper[A] => B):Zipper[B]
,bind[A](f:A => List[B]):List[B]
这就是为什么List
是 aMonad
和Zipper
是 a Comonad
。
是否有意义 ?