Non sono sicuro di come descrivere questo problema, quindi mostrerò solo le firme del tipo.Esiste un modo per appiattire le monadi annidate di tipi diversi?
ho un'istanza di quanto segue:
val x:Future[F[Future[F[B]]]] = ???
E voglio un'istanza di:
val y:Future[F[B]] = ???
F
è una monade, così mi hanno i seguenti metodi:
def pure[A](a:A):F[A] = ???
def flatMap[A, B](fa:F[A], f:A => F[B]):F[B] = ???
def map[A, B](fa:F[A], f:A => B):F[B] = flatMap(fa, (a:A) => pure(f(a)))
Penso che quanto segue dovrebbe funzionare, ma non sembra giusto:
x.flatMap { fWithFuture =>
val p = Promise[F[B]]
flatMap(fWithFuture, (futureF: Future[F[B]]) => {
p.completeWith(futureF)
pure(())
})
p.future
}
C'è un concetto che mi manca?
Un po 'di informazioni di base. Sto cercando di definire una funzione come questa:
def flatMap[A, B](fa:Future[F[A]], f: A => Future[F[B]]):Future[F[B]] = ???
Forse questa è concettualmente una cosa strana. Eventuali suggerimenti su astrazioni utili sono i benvenuti.
FWIW, ho risolto questo problema nel codice prima di utilizzare l'approccio forza bruta che avete qui. Anch'io non mi sentivo in grado di farlo, ma non ho capito niente di meglio. – joescii
Benvenuti nel mondo goffo e goffo dei trasformatori monad! –
@RexKerr stai dicendo che questo è il modo per farlo? – EECOLOR