gpt4 book ai didi

scala - `F[Something[F]]` 背后的意图是什么?

转载 作者:行者123 更新时间:2023-12-04 02:37:29 24 4
gpt4 key购买 nike

我看到很多F[Request[F]] , F[Monitor[F]]F[Something[F]]大约。尽管我了解如何处理此问题的机制,但我对为什么某些效果 ( F ) 应该像这样出现(两者都环绕在 Something 周围并出现在该 Something 内)没有直观的理解。洞察力?

最佳答案

一个简单的 HTTP 服务器可以用以下函数表示:
请求 => 响应

但是,我们通常需要执行有效的操作,例如从数据库中检索数据或调用外部服务。这种情况我们会这样定义:
请求 => F[响应]

http4s 对路由(端点)有自己的抽象,称为 HttpRoutes[F],它是 Kleisli[OptionT[F, ?], Request, Response] 的类型别名,如文档中所述。

正如我们从 cat 文档中知道的那样,Kleisli 只是返回 Option[A]、Either[L、R] 等一元值的函数的组合。

One of the most useful properties of functions is that they compose. That is, given a function A => B and a function B => C, we can combine them to create a new function A => C.



在这种情况下,http4s 的 Kleislei 接受 Request 并返回 F[Response],只需 Request => F[Response]。 F 是一种效果类型。

通过对上述请求和响应类型进行一些修改,我们得到以下内容:
type HttpRoutes[F] = Kleisli[OptionT[F, *], Request[F], Response[F]]

HttpRoutes[F] 被声明为一系列简单的 case 语句。每个 case 语句都尝试匹配并可选地从传入的 Request[F] 中提取。与第一个匹配案例相关联的代码用于生成 F[Response[F]]。

最简单的 case 语句匹配所有请求而不提取任何内容。请求的右侧必须返回 F[Response[F]]。

我们可以在这里看到 F[Response[F]] 的简单演示
scala> val getRoot = Request[IO](Method.GET, uri"/")
getRoot: org.http4s.Request[cats.effect.IO] = Request(method=GET, uri=/, headers=Headers())

scala> val io = service.orNotFound.run(getRoot)
io: cats.effect.IO[org.http4s.Response[cats.effect.IO]] = <function1>

这里 cats.effect.IO[org.http4s.Response[cats.effect.IO]]尚未解决,这是 aync 结果。它将在 future 某个时候以简单的 Future/Promise 形式解决。我们可以强制它运行:
scala> val response = io.unsafeRunSync
response: org.http4s.Response[cats.effect.IO] = Response(status=200, headers=Headers())
  • Kleisli
  • Http4s
  • Scala 中的实用 FP,作者:Gabriel Volpe
  • 关于scala - `F[Something[F]]` 背后的意图是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61008873/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com