Как я могу избежать map(identity)
в for
-пониманиях Scala?
Например, рассмотрим:
import scala.concurrent._
import scala.concurrent.duration._
object Test extends App {
implicit val executorContext = ExecutionContext.global
val future = Future.successful { 1 }
val result = for (
value <- future;
b <- Future { value * 2 }
) yield b
println(Await.result(result, 60 seconds))
}
IIUC, for
-понимание переводится как что-то вроде
future.flatMap(value => Future { value * 2 }).map(identity)
Могу ли я каким-то образом избежать завершающего map(identity)
? Или может/может/может ли Scala оптимизировать его? (Я полагаю, что не может, так как неясно, есть ли у map
какие-либо побочные эффекты, верно?)
P.S. Я знаю, что в этом конкретном примере все можно улучшить. Меня интересует общий случай, когда, например, Future { value * 2}
является вызовом f(value)
функции f
, возвращающей будущее.
.map(identity)
- person om-nom-nom   schedule 25.01.2013.map(identity)
. просто запустите scalac -Xprint:typer, чтобы убедиться в этом. - person pedrofurla   schedule 25.01.2013val result = future.map( _ * 2)
? - person Bruno Grieder   schedule 25.01.2013scalac -Xprint:parser
вы получите:(...) val result = future.flatMap(((value) => Future(value.$times(2)).map(((b) => b)))); (...)
@pedrofurla, какую версию scala вы используете? - person Francois G   schedule 25.01.2013for
, чрезвычайно полезен для разъяснения исходного кода после первого или второго генератора или фильтра. - person Randall Schulz   schedule 25.01.2013map
- person Bruno Grieder   schedule 25.01.2013for
сахар — замечательная вещь. - person Randall Schulz   schedule 25.01.2013