簡體   English   中英

如何從Cats State創建Cats IO monad

[英]How to create cats IO monad from cats State

我正在與貓一起工作,我想將val x: State[A, B]StateT[IO, A, B] 注意:IO來自貓的效果。
如何優雅地做到這一點?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM