如何从猫州创建猫IO MONAD



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

cats.arrow.FunctionK.lift结合使用mapK

x.mapK(lift(IO.eval))

完整的编译代码段:

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(_)))

尝试

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)

相关内容

  • 没有找到相关文章

最新更新