假设:
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)
但是,有什么方法可以让我改变我的第一个非编译代码吗?
答案 0 :(得分:6)
这是一个已知的错误。请参阅SI-7222。
目前,如果您要依赖RightProjection
,则必须匹配整个元组,并使用_1
和_2
个访问者。
您也可以使用权限偏向的Either
,例如scalaz.\/
,但在此示例中需要Monoid[Boolean]
。