Как создать монаду для кошек IO из кошек State - PullRequest
3 голосов
/ 02 июля 2019

Я работаю с кошками и хочу преобразовать свой val x: State[A, B] в StateT[IO, A, B]. Примечание: IO от кошачьих эффектов.
Как это сделать элегантно?

Ответы [ 2 ]

5 голосов
/ 02 июля 2019

Попробуйте 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(_)))
2 голосов
/ 02 июля 2019

Попробуйте

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)
...