函数式编程中的 Applicative 与 Traversable 函子深度解析
1. Traverse 的应用
1.1 组合可遍历结构
遍历操作的本质要求保留其参数的结构形状,这既是其优势也是劣势。当我们尝试将两个结构组合成一个时,这点体现得尤为明显。
给定 Traverse[F] ,我们能否将 F[A] 类型的值和 F[B] 类型的值组合成 F[C] 类型的值呢?我们可以尝试使用 mapAccum 来编写一个通用的 zip 函数:
extension [A](fa: F[A])
def zip[B](fb: F[B]): F[(A, B)] =
fa.mapAccum(fb.toList):
case (a, Nil) => sys.error("zip: Incompatible shapes.")
case (a, b :: bs) => ((a, b), bs)
.apply(0)
这个版本的 zip 函数无法处理不同形状的参数。例如,如果 F 是 List ,它就无法处理不同长度的列表。在这个实现中,列表 fb 的长度必须至少和 fa 一样。如果 F </
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



