我有一些嵌套调用flatMap的代码,如下所示:
foo.flatMap(implicit f => bar(123).flatMap(b =>
/* and so on... implicit f is still in scope here.*/
))
通常我们会写成for comprehension的形式,这样代码就更易读了:
通常情况下,人们会使用for comprehension来编写代码,使得代码更易于阅读。
for {
f <- foo
b <- bar(123)
/* yet more method calls that need f as an implicit parameter*/
}
但是我需要f
是隐式的,而且我不认为使用for comprehensions可以实现这一点。有方法可以实现吗?当然,我可以显式地传递f
,但那意味着再见美丽的DSL。我对Scala 2.9和2.10的答案都很感兴趣。
只是为了明确起见,我想做这样的事情,但它无法编译:
for {
implicit f <- foo
b <- bar(123) //bar takes implicit argument
/* yet more method calls that need f as an implicit parameter*/
}
编辑: 或许提出一个功能请求会是一个好主意?
编辑2: 这应该适用于所有可以在 for 推导式中使用的类型,因此不仅限于通常的集合类型,如 List
或 Seq
,还包括 Future
。