4

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

4

2 回答 2

8

尝试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]is 实际上StateT[Eval, S, A],并且您想替换Evalby IO- 这就是mapK通常的用途。


另一种选择kind-projector

x.mapK(Lambda[Eval ~> IO](IO.eval(_)))
于 2019-07-01T23:29:55.330 回答
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)
于 2019-07-01T23:01:21.770 回答