Tôi không chắc chắn làm thế nào để mô tả vấn đề này, vì vậy tôi sẽ chỉ hiển thị các chữ ký loại.Có cách nào để làm phẳng các monads lồng nhau của các loại khác nhau không?
Tôi có một thể hiện các nội dung sau:
val x:Future[F[Future[F[B]]]] = ???
Và tôi muốn một thể hiện của:
val y:Future[F[B]] = ???
F
là một đơn nguyên, vì vậy tôi có các phương pháp sau:
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)))
Tôi nghĩ những điều sau đây sẽ hiệu quả nhưng không cảm thấy đúng:
x.flatMap { fWithFuture =>
val p = Promise[F[B]]
flatMap(fWithFuture, (futureF: Future[F[B]]) => {
p.completeWith(futureF)
pure(())
})
p.future
}
Có khái niệm nào bị thiếu không?
Một chút thông tin cơ bản. Tôi đang cố xác định một chức năng như sau:
def flatMap[A, B](fa:Future[F[A]], f: A => Future[F[B]]):Future[F[B]] = ???
Có thể đây là một điều kỳ lạ về mặt khái niệm. Bất kỳ lời khuyên về abstractions hữu ích được chào đón.
FWIW, tôi đã giải quyết vấn đề này trong mã trước khi sử dụng phương pháp tiếp cận vũ lực mà bạn có ở đây. Tôi cũng không cảm thấy đúng khi làm điều đó, nhưng tôi đã không tìm ra điều gì tốt hơn. – joescii
Chào mừng đến với thế giới vụng về và vụng về của máy biến áp đơn nguyên! –
@RexKerr là bạn nói đây là cách để làm điều đó? – EECOLOR