[英]How to create cats IO monad from cats State
我正在與貓一起工作,我想將val x: State[A, B]
為StateT[IO, A, B]
。 注意:IO來自貓的效果。
如何優雅地做到這一點?
將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(_)))
嘗試
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.