首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过Kleisli传播语境?

如何通过Kleisli传播语境?
EN

Stack Overflow用户
提问于 2022-02-11 13:23:40
回答 1查看 58关注 0票数 0

只是试图在Kleisli中传播我的跟踪上下文,就像最初在下一教程中所做的那样。

代码语言:javascript
复制
  object TraceLogger {
    def log(msg: String): Kleisli[IO, UUID, Unit] = Kleisli { traceId => IO(println(s"[$traceId] $msg")) }
  }

  trait ServiceStub {
    def request(arg: String): Kleisli[IO, UUID, _]
  }

  trait ClientStub {
    def get(arg: String): Kleisli[IO, UUID, _]
  }

  case class FirstServiceExample(clientStub: ClientStub) extends ServiceStub {
    override def request(arg: String): Kleisli[IO, UUID, _] = Kleisli { (context: UUID) =>
      val requestComputation = clientStub.get("calling second service!")
      TraceLogger.log(arg)
      requestComputation(context)
    }
  }

  case class FirstClientExample(service: FirstServiceExample) {
    def request(): IO[_] = {
      val traceId = UUID.randomUUID()
      service.request("root!").run(traceId)
    }
  }

现在我需要执行死刑:

代码语言:javascript
复制
 val exampleClientStub = new ClientStub() {
      override def get(arg: String): Kleisli[IO, UUID, _] = Kleisli.ask
 }

val exampleClientService = FirstServiceExample(exampleClientStub)
FirstClientExample(exampleClientService).request().unsafeRunSync()

但是,不幸的是,我没有看到任何日志。你能帮我找个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2022-02-11 13:30:36

TraceLogger.log(arg) --它返回一个IO,它只是对计算的描述;它什么也不做。

由于您只保留了这个值--它相当于在代码中间有一个1 --它就被简单地丢弃了。

您需要将您的IOs链接在一起,以创建新的IOs,它表示“执行此操作,然后执行该操作”,这基本上就是flatMap方法所做的。

代码语言:javascript
复制
Kleisli { (context: UUID) =>
  val requestComputation = clientStub.get("calling second service!")
  TraceLogger.log(arg)(context) >> // >> is equivalent to flatMap(_ => )
  requestComputation(context)
}

(也许有更好的方法来写这个,我不习惯Kliesli__)

Fabio关于"Programas值“的系列文章可能非常有用:https://systemfw.org/archive.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71080822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档