首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala ::用于理解,或者使用自由变量

Scala ::用于理解,或者使用自由变量
EN

Stack Overflow用户
提问于 2017-03-01 19:13:26
回答 2查看 1K关注 0票数 0

我需要将返回Either[String, X]的一系列函数打包成一个理解函数,还需要使用一些纯函数来转换某些调用的结果,并将这些结果缓存在临时变量中。

以下(非常人工的)代码没有编译

代码语言:javascript
复制
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 {...}表达式中定义任意类型的变量(而不是两者之一)?

EN

回答 2

Stack Overflow用户

发布于 2017-03-01 20:00:14

在Scala2.12中,Either是一种可以使用for组合的一元类型,因此以下工作如下:

代码语言:javascript
复制
val z = for {
  x <- Right("aaa")
  y <- Right((1, x))
 ...
}

正如注释中提到的@jdevelop,这在2.10或2.11中不起作用。

如果您的Left类型是一个异常,那么Try是一个很好的选择。如果您需要一个可移植的Either版本,那么编写一个这样的版本就不难了,尽管这很烦人。

票数 0
EN

Stack Overflow用户

发布于 2020-04-11 15:40:27

您可以使用这样的隐式转换器:

代码语言:javascript
复制
  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中使用相同的综合代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42540090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档