适合异步 http 请求的 return 类型? IO[未来[响应]]还是未来[响应]?或者其他选择?

Appropriate return type for an async http request? IO[Future[Response]] or Future[Response]? Or some alternative?

对于以下假设函数(在 scala 中),在函数式编程中什么是合适的 return 类型?

def execute(req: HttpRequest): <UnknownResultType>

我假设 IO[Future[Response]],因为我们同时具有网络副作用和异步性。

因为这可能有点麻烦(一个 monad 包裹在一个 monad 中,即使有 monad 转换器),FP 中是否有更好的抽象来处理这个问题?

正如@Travis Brown 所说,在 Scala 中 return 纯异步计算的最惯用方法是使用 scalaz.concurrent.Task,您可以在 scalaz-concurrent 库中找到它。

使用 Task 您的函数将如下所示:

def execute(req: HttpRequest): Task[Response]

execute 是一个纯函数:在您调用 Task.run 或类似方法之前不会发生任何副作用。

有关 Task 的详细介绍,请参阅 this great article