不与理解 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 以获得 RightProjection 或 LeftProjection 确实有组合子。您需要将 Either 投影为正确的。下面的代码将 return Right(6).
for {
x <- Right(1).right
y <- Right(2).right
z <- Right(3).right
} yield x + y + z
背景
我正在尝试使用 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 以获得 RightProjection 或 LeftProjection 确实有组合子。您需要将 Either 投影为正确的。下面的代码将 return Right(6).
for {
x <- Right(1).right
y <- Right(2).right
z <- Right(3).right
} yield x + y + z