如果我有一个Future[Either[String, Int]]
表示可能的错误消息(String
)或成功的计算(Int
),则很容易将Future
的潜在故障作为错误消息移到左侧:
def handleFailure(fe: Future[Either[String,Int]]) =
f.recover({ case e: Exception => Left(s"failed because ${e.getMessage}"))
我希望
EitherT
存在类似的东西,但是也许我只是找不到它叫什么。它相对简单,但是需要拆箱并重新装箱,感觉很不舒服:EitherT:def handleFailureT(fe: EitherT[Future, String, Int]) =
EitherT(handleFailure(et.value)) // See above for handleFailure definition
猫确实在while ago上添加了
MonadError
实例,但这是专门用于直接恢复到Either的right
中,而不是替换Either本身。handleFailureT
是否在Cats中实现,如果是的话,它叫什么? 最佳答案
这一点一点都不明显,但是我认为这就是attempt
和attemptT
的用途。例如:
val myTry: Try[Int] = Try(2)
val myFuture: Future[String] = Future.failed(new Exception())
val myTryET: EitherT[Try, Throwable, Int] = myTry.attemptT
val myFutureET: EitherT[Future, Throwable, String] = myFuture.attemptT
// alternatively
val myFutureET: EitherT[Future, Throwable, String] = EitherT(myFuture.attempt)
有一个PR可以将其添加到文档中:https://github.com/typelevel/cats/pull/3178-但是它目前没有出现在文档中。但是,您可以在这里看到它:https://github.com/typelevel/cats/blob/master/docs/src/main/tut/datatypes/eithert.md#from-applicativeerrorf-e-to-eithertf-e-a关于scala - 正在将潜在的 future 恢复到Cats的EitherT Left中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54931204/