为什么flatMap链在第一个Left值处停止但在Right值处继续

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)

斯卡拉小提琴

Izb*_*gen 5

原因是从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