Kleisli [未来,背景,\ /]到Kleisli [EitherT,Context,...]

时间:2016-04-12 09:14:22

标签: scala scalaz monad-transformers

由于我希望将Kleisli与可能失败Future的长方法Either结合使用,我需要叠加效果。以下是在Kleisli中叠加效果的结果代码。 scalaz中是否有现有的组合器?

type FutureEitherT[A] = EitherT[Future, String, A]

def toKleisliEitherTFromDisjunction[A](f: Kleisli[Future, Context,String \/ A]) = 
  Kleisli[FutureEitherT, Context, A] { ctx => EitherT(f(ctx)) }

我尝试过没有成功f.liftMK[FutureEitherT],但不幸的是,Kleisli类型构造函数中的第三种类型仍然是Either

1 个答案:

答案 0 :(得分:2)

您可以使用mapK

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scalaz.{\/, EitherT, Kleisli}
import scalaz.std.scalaFuture

type FutureEitherT[A] = EitherT[Future, String, A]

val futureK: Kleisli[Future, Int, String \/ Int] = 
  Kleisli.ask[Future, Int] map (i => \/.right[String, Int](i)))

futureK mapK[FutureEitherT, Int]( EitherT.eitherT )
// scalaz.Kleisli[FutureEitherT,Int,Int] = Kleisli(<function1>)