我正在和猫一起工作,我想把我的val x: State[A, B]转换成StateT[IO, A, B]。注意: IO来自猫-效果。
如何优雅地做这件事?
发布于 2019-07-01 23:29:55
尝试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],并且您希望用IO代替Eval --这是mapK通常的用途。
kind-projector的另一种选择
x.mapK(Lambda[Eval ~> IO](IO.eval(_)))发布于 2019-07-01 23:01:21
试一试
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)https://stackoverflow.com/questions/56843234
复制相似问题