Scala:如何将flatMap/map链式调用改写为for-comprehension?
代码改写结果与说明
你的原始代码基于右偏Either实现链式逻辑,其中嵌套的flatMap+map结构可直接转换为for推导,完整改写代码如下:
val result = (for { c <- parseCommand(x) r <- calculate(c) } yield renderResult(c, r)) .left.map(e => e.value) .merge
对应逻辑说明
- for推导中的
c <- parseCommand(x)对应原始代码flatMap的执行前提:parseCommand(x)返回Right时才会将值绑定到c继续执行,返回Left会直接终止推导 r <- calculate(c)对应内层的calculate(c)调用,同样仅在返回Right时绑定ryield renderResult(c, r)对应原始代码内层的map(r => renderResult(c, r))逻辑- 后续的
left.map、merge是对整个Either结果的全局后置处理,不属于嵌套的monadic操作,无需放入for推导,直接保留在推导外部即可。
兼容提示:如果使用Scala 2.12之前的版本,Either默认不是右偏的,需要手动添加右投影才能正常使用for推导,改写方式如下:
val result = (for { c <- parseCommand(x).right r <- calculate(c).right } yield renderResult(c, r)) .left.map(e => e.value) .merge
内容的提问来源于stack exchange,提问作者Arthur Adams
相关产品推荐
相关产品推荐

