【发布时间】:2019-11-12 13:21:41
【问题描述】:
我正在与猫一起工作,我想将我的 val x: State[A, B] 转换为 StateT[IO, A, B]。注意:IO 来自于猫的效果。
如何优雅地做到这一点?
【问题讨论】:
标签: scala scala-cats cats-effect
我正在与猫一起工作,我想将我的 val x: State[A, B] 转换为 StateT[IO, A, B]。注意:IO 来自于猫的效果。
如何优雅地做到这一点?
【问题讨论】:
标签: scala scala-cats cats-effect
尝试将mapK 与cats.arrow.FunctionK.lift 结合使用:
x.mapK(lift(IO.eval))
完整的可编译代码sn-p:
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)
【讨论】: