Scala 用于分离和未来的Monad变压器

Scala 用于分离和未来的Monad变压器,scala,functional-programming,monads,monad-transformers,Scala,Functional Programming,Monads,Monad Transformers,我有一个返回Future[String\/Response]的代码,析取和函数getResult:Response=>[String\/Result]的monad实例。 现在,这是用几个嵌套函数编写的,我想如下所示 for { response <- getResponse result <- getResult(response) } yield result // Future[String \/ Result] 用于{ response您可以使用来组合\/(析取)

我有一个返回
Future[String\/Response]
的代码,
析取和函数
getResult:Response=>[String\/Result]
的monad实例。 现在,这是用几个嵌套函数编写的,我想如下所示

for {
  response <- getResponse
  result <- getResult(response)
} yield result   // Future[String \/ Result]
用于{
response您可以使用来组合
\/
(析取)和另一个单子的效果,在您的案例中是
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]

嘿,彼得。谢谢你给我指点scalaz Either,我错过了。不幸的是,你的两个例子都不起作用:第一个是因为
getResult
不返回Future,第二个是因为两个函数都不符合R[\uz]类型。总之,这是有效的:
Either(getResponse).map(getResult).run
,比我以前的实现稍微好一点。另外,我仍然对没有transformer时该怎么做有点好奇。UPD:不,我错了。我的映射导致嵌套析取。我可能可以执行
连接
,但这看起来一点也不优雅。
映射
确实是
EitherT[F,a,B]中的一个函数
EitherT[F,A,C]
所以你得到
EitherT[F,String,String\/Result]
。一个解决方案可以是使用
flatMapF
EitherT(getInt)。flatMapF(getRes(。.point[Future])。运行
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]