这是一个后续行动 答案 我以前的问题。

假如我需要映每个项目 a:AList[A]b:B 与功能 def f(a:A, leftNeighbors:List[A]): B 并生成 List[B].

显然我不能就叫 map 在名单上,但我可以使用的列表 拉链.拉链是一个光标移动列表。它提供了访问的当前件(focus)和它的邻居。

现在我可以替代我的 fdef 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 是一个 MonadZipper 是一个 Comonad.

是否有意义?

有帮助吗?

解决方案

作为这个问题出现了定期的"未答复"列表,我只是复制我的评论作为一个答案在这里-没有什么相当多的建设性已经出现了自从一年前,无论如何。

一个 List 可以被看作是一个comonad只以及(在多个方面),同时了 Zipper 可以转换为一个单(也在许多方面).区别是是否在概念上是集中在"追加"的数据进行建设性对一个国家机器(这是什么 Monad 接口有关),或"抽出"国家从其"deconstructively"(这是什么 Comonad 不会).

它不是容易回答的问题,说明为"不会这样的理解有意义",但是。在某种意义上讲它的确,在另一个却没有。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top