我有一个代码返回Future[String \/ Response]
,Disjunction
和Future
以及函数getResult: Response => [String \/ Result]
的monad实例。
现在这是用几个嵌套函数编写的,我希望将其视为以下
for {
response <- getResponse
result <- getResult(response)
} yield result // Future[String \/ Result]
据我所知,Monad变形金刚正在使用这个目的,如果我有Option
而不是\/
,我可以做similar件事。但遗憾的是,我无法找到FutureT
或DisjunctionT
(尽管猫存在XorT
)。
那么,是否可以为上述目的编写monad变压器?可能它已经存在或者我不明白。
答案 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]
或者您可以更改getResponse
和getResult
函数的返回类型以返回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]