使用 Scala 2.9.1,考虑以下两个实例Either
:
scala> val er: Either[String, Int] = Right(1)
er: Either[String,Int] = Right(1)
scala> val el: Either[String, Int] = Left("a")
el: Either[String,Int] = Left(a)
很棒的是,通过使用left
andright
投影,可以使用 for-comprehensions(通过投影 Either 的有偏单子):
scala> for { r <- er.right } yield r * 2
res6: Product with Either[String,Int] with Serializable = Right(2)
scala> for { r <- el.right } yield r * 2
res7: Product with Either[String,Int] with Serializable = Left(a)
有人可以向我解释为什么决定不让该filter
方法返回一个 Either 吗?我本来希望以下工作:
scala> for { r <- er.right if r > 2 } yield r * 2 // r is NOT greater than 2!
res8: Product with Either[String,Int] with Serializable = Left(a)
相反,您会收到以下错误: :9: error: value * is not a member of Either[Nothing,Int] for { r <- er.right if r > 2 } yield r * 2
看起来底层调用Either.RightProjection#filter
实际上返回了一个Option
:
scala> er.right.filter(_ > 2)
res9: Option[Either[Nothing,Int]] = None
这破坏了在 for-comprehension 中使用 if 子句,至少是我尝试使用它的方式。
有没有人解释为什么这个设计是这样的?