Scala 使用异步[F]将未来[A]转换为F[A]

Scala 使用异步[F]将未来[A]转换为F[A],scala,monads,future,scala-cats,tagless-final,Scala,Monads,Future,Scala Cats,Tagless Final,我和斯里克和猫一起工作 database.run返回一个Future,但是我需要我的类generic on F[\ux]:Async的方法来返回monad F。我可以让它像这样工作 val future = database.run(insertion) val result = Await.result(future, Duration.Inf) Async[F].delay(result) 但这并不是应该确定的方式,因为它阻塞了线程 有什么合适的方法可以做到这一点吗?异步。

我和斯里克和猫一起工作

database.run返回一个Future,但是我需要我的类generic on F[\ux]:Async的方法来返回monad F。我可以让它像这样工作

val future = database.run(insertion)    
val result = Await.result(future, Duration.Inf)    
Async[F].delay(result)
但这并不是应该确定的方式,因为它阻塞了线程

有什么合适的方法可以做到这一点吗?

异步。fromFuture是您所需要的。 和往常一样,他是你的朋友

import cats.effect.{Async, ContextShift]

def foo[F[_] : Async : ContextShift]: F[Result] =
  Async.fromFuture(Async[F].delay(database.run(insertion)))