使用 Async[F] 将 Future[A] 转换为 F[A]

mar*_*iii 0 monads scala future scala-cats tagless-final

我正在与 Slick 和 Cats 合作。

database.run返回 a Future,但我需要我的类的方法(泛型 on F[_]: Async)来返回 monad F。我可以让它像这样工作

val future = database.run(insertion)    
val result = Await.result(future, Duration.Inf)    
Async[F].delay(result)
Run Code Online (Sandbox Code Playgroud)

但这肯定不是应该做的方式,因为它阻塞了线程。

有没有合适的方法来做到这一点?

Lui*_*rez 6

Async.fromFuture是你所需要的。
与往常一样,scaladoc是您的朋友。

import cats.effect.{Async, ContextShift]

def foo[F[_] : Async : ContextShift]: F[Result] =
  Async.fromFuture(Async[F].delay(database.run(insertion)))
Run Code Online (Sandbox Code Playgroud)