gpt4 book ai didi

scala - 需要澄清混淆 Http4s 消息类型 `Response[F]`/ `Request[F]`

转载 作者:行者123 更新时间:2023-12-04 01:02:11 26 4
gpt4 key购买 nike

我很难理解为什么请求 回复 中参数化传真 .
采取类似的方法是猫效应数据类型资源。
从文档
https://typelevel.org/cats-effect/docs/std/resource
我们找到以下定义

object Resource {
def make[F[_], A](acquire: F[A])(release: A => F[Unit]): Resource[F, A]

def eval[F[_], A](fa: F[A]): Resource[F, A]
}

abstract class Resource[F, A] {
def use[B](f: A => F[B]): F[B]
}
特别是 def use[B](f: A => F[B]): F[B]清楚地说明了为什么 Resource 在 F 中被参数化。
鉴于文档中没有任何内容解释 Response[F](请注意,我非常理解为什么 F[Response],这是我不了解的内部 F),我查看了一下代码 https://github.com/http4s/http4s/blob/main/core/src/main/scala/org/http4s/Message.scala
除非我看不够仔细,否则我找不到任何可以证明效果类型存在的理由。
有人可以解释内部 F 参数。
以与 https://www.haskellforall.com/2013/06/the-resource-applicative.html 类似的方式

A Resource is an IO action which acquires some resource of type a andalso returns a finalizer of type IO () that releases the resource. Youcan think of the a as a Handle, but it can really be anything whichcan be acquired or released, like a Socket or AMQP Connection.


我们能否对什么是响应以及它做什么有一个概念性的定义,这确实需要它对特定的效果类型进行参数化?

最佳答案

让我们看看 Http[F, G] 的定义,这是 http4s 的核心:

/** A kleisli with a [[Request]] input and a [[Response]] output.  This type
* is useful for writing middleware that are polymorphic over the return
* type F.
*
* @tparam F the effect type in which the [[Response]] is returned
* @tparam G the effect type of the [[Request]] and [[Response]] bodies
*/
type Http[F[_], G[_]] = Kleisli[F, Request[G], Response[G]]
Kleisli本质上是一个有效函数的包装器: A => F[B] :
final case class Kleisli[F[_], -A, B](run: A => F[B])
如果我们在这里开发俄罗斯方块类型,我们会看到 Http 的实际类型签名是:
Request[G] => F[Response[G]]
现在,原因是 RequestResponseG 中参数化是它们可能包含一个 body 。我们从两个定义中看到这一点:
final class Request[F[_]](
val method: Method = Method.GET,
val uri: Uri = Uri(path = "/"),
val httpVersion: HttpVersion = HttpVersion.`HTTP/1.1`,
val headers: Headers = Headers.empty,
val body: EntityBody[F] = EmptyBody,
val attributes: Vault = Vault.empty

final case class Response[F[_]](
status: Status = Status.Ok,
httpVersion: HttpVersion = HttpVersion.`HTTP/1.1`,
headers: Headers = Headers.empty,
body: EntityBody[F] = EmptyBody,
attributes: Vault = Vault.empty)
extends Message[F] {
您可以看到 F用于 EntityBody[F] ,它本身就是 Stream[F, Byte] 的类型别名用于延迟消耗效果中的输入/输出流 F .
专为 HttpRoutes[F]而设的就是这种情况这两个类型参数实际上是相同的:
type HttpRoutes[F[_]] = Http[OptionT[F, *], F]
这真的是:
Request[F] => F[Option[Response[[F]]]
因此我们看到 F[Response[F]] 的原因无处不在,而不是有一个单独的类型参数体。
综上所述,外 FF[Response[G]]用于捕获产生响应可能是有效操作的事实。这就是为什么 F通常是某种 IO 类型(cats-effect IOZIO[R, E, A] 等),而内部 G在请求/响应中用于建模在给定效果中产生字节的流。

关于scala - 需要澄清混淆 Http4s 消息类型 `Response[F]`/ `Request[F]`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67916337/

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