如何从Cats State创建Cats IO monad

Mik*_*ike 3 scala scala-cats cats-effect

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

And*_*kin 6

mapK结合尝试cats.arrow.FunctionK.lift

x.mapK(lift(IO.eval))
Run Code Online (Sandbox Code Playgroud)

完整的可编译代码段:

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))
}
Run Code Online (Sandbox Code Playgroud)

这工作,因为State[S, A]确实是StateT[Eval, S, A],你要替换EvalIO-这是什么mapK通常是。


另一种选择是kind-projector

x.mapK(Lambda[Eval ~> IO](IO.eval(_)))
Run Code Online (Sandbox Code Playgroud)