Я создаю List
из Int
, используя асинхронное вычисление для извлечения элемента:
(1 to n).map(anAsyncThingy).toList
где anAsyncThingy
возвращает OptionT[Future, Int]
Следовательно, результат имеет тип List[OptionT[Future, Int]]
То, что я хотел бы получить сейчас, это OptionT[Future, List[A]]
Вот моя лучшая попытка (я добавлю несколько заглушек, чтобы она могла работать в REPL)
import scalaz._; import Scalaz._
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
def anAsyncThingy(x: Int): OptionT[Future, Int] = x.point[Future].liftM[OptionT]
val res = OptionT {
Future.sequence {
(1 to 3).map(anAsyncThingy(_).run).toList
}.map(_.sequence)
}
res.map(println) // List(1, 2, 3)
Вышеупомянутое работает, как и ожидалось, но я чувствую, что есть много возможностей для улучшения, используя правильные конструкции scalaz, вместо того, чтобы прыгать от монадных трансформеров.
Как я могу добиться того же результата более простым способом?