我正在和猫一起工作,我想将我的val x: State[A, B]
转换为StateT[IO, A, B]
。注意:IO来自猫的效果。
如何优雅地做到这一点?
答案 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)