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]