Monad变压器用于分离和未来

时间:2015-10-27 15:54:11

标签: scala functional-programming monads monad-transformers

我有一个代码返回Future[String \/ Response]DisjunctionFuture以及函数getResult: Response => [String \/ Result]的monad实例。 现在这是用几个嵌套函数编写的,我希望将其视为以下

for {
  response <- getResponse
  result <- getResult(response)
} yield result   // Future[String \/ Result]

据我所知,Monad变形金刚正在使用这个目的,如果我有Option而不是\/,我可以做similar件事。但遗憾的是,我无法找到FutureTDisjunctionT(尽管猫存在XorT)。

那么,是否可以为上述目的编写monad变压器?可能它已经存在或者我不明白。

1 个答案:

答案 0 :(得分:3)

您可以使用scalaz.EitherT结合\/(Disjunction)和另一个monad的效果,例如Future

def getResponse: Future[String \/ Response] = ???
def getResult(resp: Reponse): Future[String \/ Result] = ???

(for {
  response <- EitherT(getResponse)
  result <- EitherT(getResult(response))
} yield result).run
// Future[String \/ Result]

或者您可以更改getResponsegetResult函数的返回类型以返回EitherT

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

def getResponse: R[Response] = ???
def getResult(resp: Reponse): R[Result] = ???

(for {
  response <- getResponse
  result <- getResult(response)
} yield result).run
// Future[String \/ Result]