我需要将返回Either[String, X]的一系列函数打包成一个理解函数,还需要使用一些纯函数来转换某些调用的结果,并将这些结果缓存在临时变量中。
以下(非常人工的)代码没有编译
1: def someFunc(x: Int): Either[String, Int] = Right(x)
2:
3: def someMath(i: Int): Int = i
4:
5: val z = for {
6: x <- Right("aaaa").right
7: y <- Right((1, x)).right
8: tmp = someMath(y._1)
9: t <- Right(tmp).right
A: l <- someFunc(tmp).right
B: } yield l
C:
D: z错误:(7,6)值flatMap不是scala.util.EitherNothing可序列化产品的成员,((Int,String),Int) y <- Right((1,x)).right ^
如何在for {...}表达式中定义任意类型的变量(而不是两者之一)?
发布于 2017-03-01 20:00:14
在Scala2.12中,Either是一种可以使用for组合的一元类型,因此以下工作如下:
val z = for {
x <- Right("aaa")
y <- Right((1, x))
...
}正如注释中提到的@jdevelop,这在2.10或2.11中不起作用。
如果您的Left类型是一个异常,那么Try是一个很好的选择。如果您需要一个可移植的Either版本,那么编写一个这样的版本就不难了,尽管这很烦人。
发布于 2020-04-11 15:40:27
您可以使用这样的隐式转换器:
implicit class EitherOps[A,B](val e: Either[A,B]) extends AnyVal {
def flatMap[A1 >: A, B1](f: B => Either[A1, B1]): Either[A1, B1] = e.right.flatMap(f)
def map[B1](f: B => B1): Either[A, B1] = e.right.map(f)
}使两者都有偏差,就像Scala 2.12+中那样。您应该只为Scala2.11提供它。这样,您也可以在2.12和2.11中使用相同的综合代码。
https://stackoverflow.com/questions/42540090
复制相似问题