【问题标题】:How to create cats IO monad from cats State如何从猫状态创建猫 IO monad
【发布时间】:2019-11-12 13:21:41
【问题描述】:

我正在与猫一起工作,我想将我的 val x: State[A, B] 转换为 StateT[IO, A, B]。注意:IO 来自于猫的效果。
如何优雅地做到这一点?

【问题讨论】:

    标签: scala scala-cats cats-effect


    【解决方案1】:

    尝试将mapKcats.arrow.FunctionK.lift 结合使用:

    x.mapK(lift(IO.eval))
    

    完整的可编译代码sn-p:

    import cats.effect.IO
    import cats.data.{State, StateT}
    import cats.arrow.FunctionK.lift
    
    object InjectIdIO {
      def i[S, V](x: State[S, V]): StateT[IO, S, V] = x.mapK(lift(IO.eval))
    }
    

    这是可行的,因为State[S, A] 实际上是StateT[Eval, S, A],并且您想用IO 替换Eval - 这就是mapK 通常的用途。


    kind-projector 的另一种选择:

    x.mapK(Lambda[Eval ~> IO](IO.eval(_)))
    

    【讨论】:

      【解决方案2】:

      试试

      def liftState[A, B](state: State[A, B]): StateT[IO, A, B] =
        StateT[IO, A, B] { s => IO.eval(state.run(s)) }
      

      例如

      val x: State[Int, String] = State(int => (int, "foo"))
      liftState(x)
      

      【讨论】:

        猜你喜欢
        • 2019-11-11
        • 2021-03-21
        • 2021-08-13
        • 2020-03-05
        • 2018-07-21
        • 1970-01-01
        • 2015-03-25
        • 2013-11-09
        相关资源
        最近更新 更多