首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将“平台地图”转换为“用于理解”,其中任何一种

将“平台地图”转换为“用于理解”,其中任何一种
EN

Stack Overflow用户
提问于 2015-04-01 17:03:57
回答 2查看 1.6K关注 0票数 1

给一个Either[String,Int]

代码语言:javascript
复制
scala> val z: Either[String, Int] = Right(100)
z: Either[String,Int] = Right(100)

我可以用flatMap编写以下代码

代码语言:javascript
复制
scala> z.right.flatMap(x => if(x == 100) Left("foo") else Right(x))
res14: scala.util.Either[String,Int] = Left(foo)

但是,我的for comprehension版本有什么问题呢?

代码语言:javascript
复制
scala> for {
     |  a <- z.right
     |  _ <- if(a == 100) Left("foo") else Right(a)
     | } yield a
<console>:11: error: value map is not a member of Product with Serializable 
         with scala.util.Either[String,Int]
               _ <- if(a == 100) Left("foo") else Right(a)
                    ^
EN

Stack Overflow用户

回答已采纳

发布于 2015-04-01 17:06:47

if(a == 100) Left("foo") else Right(a)是一个Either[String, Int],而不是LeftProjectionRightProjection,所以它没有mapflatMap。你也需要投射它:

代码语言:javascript
复制
for {
    a <- z.right
    _ <- (if(a == 100) Left("foo") else Right(a)).right
} yield a

这和一条线之间的区别是,一条线相当于:

代码语言:javascript
复制
for {
    a <- z.right
} yield (if(a == 100) Left("foo") else Right(a))

。。它在最后没有额外的map

票数 3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29396670

复制
相关文章

相似问题

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