相关疑难解决方法(0)

了解为什么Zipper是Comonad

这是对我上一个问题的答案的后续跟进.

假设我需要映射每个项目a:AList[A]b:B使用功能def f(a:A, leftNeighbors:List[A]): B和产生List[B].

显然,我不能只是map在列表上调用,但我可以使用列表拉链.拉链是一个在列表中移动的光标.它提供对当前element(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]这就是为什么ListMonadZipperComonad.

是否有意义 ?

functional-programming scala zipper comonad

112
推荐指数
1
解决办法
2687
查看次数

Zipper与迭代器,用于遍历列表或树

假设我需要遍历列表或树来读取(但不能修改)数据.我可以使用迭代器或拉链.是否Zipper有任何优势除了在这种情况下不可改变?

scala zipper

9
推荐指数
1
解决办法
490
查看次数

标签 统计

scala ×2

zipper ×2

comonad ×1

functional-programming ×1