函数式编程中的错误处理与严格性探讨
一、Either 数据类型及错误累积
在函数式编程里,错误处理是关键环节。Either 数据类型为我们提供了一种可行的错误处理方式,它有两个数据构造器:Left(e) 用于表示错误,Right(a) 用于表示成功结果。
我们来看一个例子,实现一个能返回所有错误的 traverse 变体 traverseAll:
def traverseAll[E, A, B](
as: List[A],
f: A => Either[List[E], B]
): Either[List[E], List[B]] =
as.foldRight(Right(Nil): Either[List[E], List[B]])((a, acc) =>
map2All(f(a), acc, _ :: _)
)
这里把 f 的类型从 A => Either[E, B] 改成了 A => Either[List[E], B] ,这样做能更方便地构建新函数。例如,用 traverseAll 定义 sequenceAll 就很直接:
def sequenceAll[E, A](
as: List[Either[List[E], A]]
): Either[List[E], List[A]] =
traverseAll(as, identity)
超级会员免费看
订阅专栏 解锁全文
1021

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



