不与理解 Scala 一起工作

Right not working with for comprehension Scala

背景

我正在尝试使用 Either 类型的 Scala 推导式,即使用 Right。 然而,尽管我很努力,但我还是收到了一个错误并且没有任何效果。

代码

我正在使用 scala 的 repl 进行一些测试。这是我能想到的最简单的用例:

scala> for {
     |   x <- Right(1)
     |   y <- Right(2)
     |   z <- Right(3)
     | } yield x + y + z

你会看到它基本上是这个页面的副本:

https://www.scala-lang.org/api/2.12.7/scala/util/Either.html

问题

但是,此操作失败并出现以下错误:

<console>:13: error: value flatMap is not a member of scala.util.Right[Nothing,Int]
         x <- Right(1)
                   ^
<console>:14: error: value flatMap is not a member of scala.util.Right[Nothing,Int]
         y <- Right(2)
                   ^
<console>:15: error: value map is not a member of scala.util.Right[Nothing,Int]
         z <- Right(3)
                   ^

我正在使用以下版本的 Scala:

Welcome to Scala 2.11.12 (OpenJDK 64-Bit Server VM, Java 11.0.13).
Type in expressions for evaluation. Or try :help.

我知道对 Either 做了一些更改,所以它变成了右偏,但我不知道这些更改会如何影响这个例子。

我错过了什么?

在 scala 2.11 中,Either 不是 Monad。它缺少像 flatMap 和 map 这样的组合器。相反,您调用 .right.left 以获得 RightProjectionLeftProjection 确实有组合子。您需要将 Either 投影为正确的。下面的代码将 return Right(6).

  for {
    x <- Right(1).right
    y <- Right(2).right
    z <- Right(3).right
  } yield x + y + z