Попробуйте 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
.
Другая альтернатива с kind-projector
:
x.mapK(Lambda[Eval ~> IO](IO.eval(_)))