'for-comprension'中元组值的模式匹配?

时间:2015-11-09 01:24:09

标签: scala

假设:

scala> val x: Either[Boolean, (Int, Int)] = Right( (5, 10) )
x: Either[Boolean,(Int, Int)] = Right((5,10))

我想在x.right中对第一个和第二个元组值进行模式匹配,但这不起作用:

scala> for { 
     |   (a, b) <- x.right
         | } yield a

<console>:14: error: constructor cannot be instantiated to expected type;
 found   : (T1, T2)
 required: scala.util.Either[Nothing,(Int, Int)]
         (a, b) <- x.right
         ^

我可以做类似的事情:

scala> for { a <- x.right } yield a match { case (x, y) => x }
res5: scala.util.Either[Boolean,Int] = Right(5)

但是,有什么方法可以让我改变我的第一个非编译代码吗?

1 个答案:

答案 0 :(得分:6)

这是一个已知的错误。请参阅SI-7222

目前,如果您要依赖RightProjection,则必须匹配整个元组,并使用_1_2个访问者。

您也可以使用权限偏向的Either,例如scalaz.\/,但在此示例中需要Monoid[Boolean]