scala - ¿Hay una manera de declarar un valor implícito dentro de una comprensión?
implicit scala-2.10 (2)
¿Qué tal este código?
// 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*
Tengo un código con llamadas anidadas a flatMap así:
foo.flatMap(implicit f => bar(123).flatMap(b =>
/* and so on... implicit f is still in scope here.*/
))
Normalmente, uno escribiría eso como una comprensión, lo que hace que el código sea mucho más legible:
for {
f <- foo
b <- bar(123)
/* yet more method calls that need f as an implicit parameter*/
}
Pero necesito que f
esté implícito y no veo una manera de hacerlo para comprenderlo. ¿Esta ahí? Por supuesto, podría aprobar f explícitamente, pero eso significaría, adiós, bastante DSL. Me interesarían las respuestas para Scala 2.9 y 2.10.
Para que quede claro, me gustaría hacer algo como esto, pero no se compilará:
for {
implicit f <- foo
b <- bar(123) //bar takes implicit argument
/* yet more method calls that need f as an implicit parameter*/
}
EDIT: ¿ Tal vez una solicitud de función sería una buena idea?
EDIT2: Esto debería funcionar con todos los tipos que se pueden usar en una comprensión, así que no solo con los tipos de colección habituales como List
o Seq
, sino también con Future
.
No, no hay. Sin embargo, hay un boleto: https://issues.scala-lang.org/browse/SI-2823