11、函数式编程中的错误处理与严格性探讨

函数式编程中的错误处理与严格性探讨

一、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)
二、提取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值