加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 在免费代数中进行流式传输的最佳方式是什么?

发布时间:2020-12-16 10:00:20 所属栏目:安全 来源:网络整理
导读:我一直在尝试使用Free monads创建一个HTTP客户端,类似于RúnarBjarnason,Composable application architecture with reasonably priced monads给出的演讲中采用的方法. 到目前为止我所拥有的内容可以在这个片段中看到,https://bitbucket.org/snippets/atlass
我一直在尝试使用Free monads创建一个HTTP客户端,类似于RúnarBjarnason,Composable application architecture with reasonably priced monads给出的演讲中采用的方法.

到目前为止我所拥有的内容可以在这个片段中看到,https://bitbucket.org/snippets/atlassian-marketplace/EEk4X.

它运作正常,但我并不完全满意.最大的痛点是由于需要在嵌入的代数上参数化HttpOps,以便允许请求和响应主体的流式传输.这使得通过简单地说不可能建立你的代数

type App[A] = Coproduct[InteractOps,HttpcOps[App,?],A]

如果尝试,则会从编译器中获得非法的循环引用错误.要解决此问题,您可以使用案例类

type App0[A] = Coproduct[InteractOps,A]   
case class App[A](app0: App0[A])

这解决了循环引用问题,但引入了一个新问题.我们不再有Inject [InteractOps,App]实例,这意味着我们不再拥有Interact [App]和Httpc [HttpcOps [App,?]]实例,因此我们必须使用manually define them代数.对于像这样的小而简单的代数,这不是太繁重,但对于更大的东西,它可以变成很多样板.

还有另一种方法可以让我们以更方便的方式包含流和代数代数吗?

解决方法

我不确定我理解为什么App需要引用自己.什么是例如预期的含义:

App(inj(Send(
  Request(GET,uri,v,hs,StreamT(App(inj(Send(
            Request(GET,StreamT(App(inj(Tell("foo")))))))))))))

也就是说,EntityBody可以由于某种原因由任意深度嵌套的HTTP请求流生成.这似乎比你需要的更强大.

这是一个在免费monad中使用流的简单示例:

case class Ask[A](k: String => A)
case class Req[F[_],A](k: Process[Ask,String] => A)
type AppF[A] = Coproduct[Ask,Req[Ask,A]
type App[A] = Free[AppF,A]

在这里,每个Req为您提供一个字符串流(scalaz.stream.Process).通过向下一个字符串询问某些内容来生成字符串(例如,通过读取标准输入或HTTP服务器或其他内容).但请注意,流的暂停仿函数不是App,因为我们不想让Req有机会生成其他Req.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读