tec*_*kuz 3 scala either flatmap
我不明白这一行:
Right(1).flatMap(_ => Left(2)).flatMap(_ => Left(3))
Right(1)被传递给.flatMap(_ => Left(2)。它返回Left(2)并传递给.flatMap(_ => Left(3)。它应该已经退货了Left(3)。但是它又回来了Left(2)。
为什么?
另一个例子是 Right(1).flatMap(_ => Right(2)).flatMap(_ => Right(3))
它返回Right(3)(应有的)。
据我了解,它的工作原理如下:
Right(1)传递给.flatMap(_ => Right(2))。它返回Right(2)并传递给.flatMap(_ => Right(3)。最后返回Right(3)
原因是从Scala 2.12开始,Either都是右偏的。这意味着当结果保留后,诸如flatMap之类的操作将停止计算。检查实现以了解它:
def flatMap[EE >: E, B](f: A => Either[EE, B]): Either[EE, B] =
this match {
case Left(value) => Left(value)
case Right(value) => f(value)
}
Run Code Online (Sandbox Code Playgroud)
因此,如您所见,在使用Left的情况下,它的构造方法是Left,并且从其中提取的值不应用f。
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |