Ответ 1
Нет, нет. Есть билет: https://issues.scala-lang.org/browse/SI-2823
У меня есть код с вложенными вызовами flatMap:
foo.flatMap(implicit f => bar(123).flatMap(b =>
/* and so on... implicit f is still in scope here.*/
))
Обычно можно написать это как для понимания, что делает код более читаемым:
for {
f <- foo
b <- bar(123)
/* yet more method calls that need f as an implicit parameter*/
}
Но мне нужно f
быть неявным, и я не вижу способа сделать это для понимания. Здесь? Конечно, я мог бы передать 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*/
}
РЕДАКТИРОВАТЬ: Может быть, запрос функции будет хорошей идеей?
EDIT2:. Это должно работать со всеми типами, которые могут использоваться для понимания, поэтому не только с обычными типами коллекций, такими как List
или Seq
, но также с Future
.
Нет, нет. Есть билет: https://issues.scala-lang.org/browse/SI-2823
Начиная с версии 0.3.0-M1, плагин лучше-monadic-for обеспечивает такую функциональность.
Как насчет этого кода?
// prerequisites
val (a,b) = (List(1,2,3), List(3,4,5,7,9))
def tree(n: Int)(implicit s: Int) = " "*s + "0"*n + (if (s+3 < n) "*" else "")
// actual for
@volatile implicit var s = 0
for (i <- a if ({s = i; true}); j <- b)
println(tree(j))
// 000
// 0000
// 00000*
// 0000000*
// 000000000*
// 000
// 0000
// 00000
// 0000000*
// 000000000*
// 000
// 0000
// 00000
// 0000000*
// 000000000*