如何从Cats State创建Cats IO monad

时间:2019-07-01 22:34:37

标签: scala scala-cats cats-effect

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

2 个答案:

答案 0 :(得分:5)

尝试将TryGetValue()val结合使用:

mapK

完整的可编译代码段:

cats.arrow.FunctionK.lift

之所以可行,是因为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]-这就是Eval通常的用途。


使用IO的另一种选择:

mapK

答案 1 :(得分: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)