了解为什么拉链是一个Comonad
-
21-12-2019 - |
题
这是一个后续行动 答案 我以前的问题。
假如我需要映每个项目 a:A
的 List[A]
要 b:B
与功能 def f(a:A, leftNeighbors:List[A]): B
并生成 List[B]
.
显然我不能就叫 map
在名单上,但我可以使用的列表 拉链.拉链是一个光标移动列表。它提供了访问的当前件(focus
)和它的邻居。
现在我可以替代我的 f
与 def f'(z:Zipper[A]):B = f(z.focus, z.left)
并通过这种新的功能 f'
要 cobind
方法 Zipper[A]
.
的 cobind
是这样的:它的呼叫 f'
与拉链,然后移拉链,电话f'
与 新的 "移动"的拉链,移拉链再等等,等等...直到拉链到达最终的清单。
最后, cobind
返回一个新的拉链的类型 Zipper[B]
, ,这可以转化为列表和使该问题得到解决。
现在注意到之间的对称 cobind[A](f:Zipper[A] => B):Zipper[B]
和 bind[A](f:A => List[B]):List[B]
这就是为什么 List
是一个 Monad
和 Zipper
是一个 Comonad
.
是否有意义?
解决方案
作为这个问题出现了定期的"未答复"列表,我只是复制我的评论作为一个答案在这里-没有什么相当多的建设性已经出现了自从一年前,无论如何。
一个 List
可以被看作是一个comonad只以及(在多个方面),同时了 Zipper
可以转换为一个单(也在许多方面).区别是是否在概念上是集中在"追加"的数据进行建设性对一个国家机器(这是什么 Monad
接口有关),或"抽出"国家从其"deconstructively"(这是什么 Comonad
不会).
它不是容易回答的问题,说明为"不会这样的理解有意义",但是。在某种意义上讲它的确,在另一个却没有。