Scala标准库中是否有从EitherTry的转换,反之亦然?也许我缺少了一些东西,但没有找到它们。

最佳答案

据我所知,这在标准库中不存在。尽管通常使用Either表示失败,而使用Left表示成功,但实际上它的设计目的是支持两种可能的返回类型的概念,其中一种不一定是失败情况。我猜想这些转换将不存在,因为Right并非像Either那样真正设计为成功/失败单子(monad)。话虽如此,自己丰富Try并添加这些转换将非常容易。可能看起来像这样:

object MyExtensions {
  implicit class RichEither[L <: Throwable,R](e:Either[L,R]){
    def toTry:Try[R] = e.fold(Failure(_), Success(_))
  }

  implicit class RichTry[T](t:Try[T]){
    def toEither:Either[Throwable,T] = t.transform(s => Success(Right(s)), f => Success(Left(f))).get
  }
}

object ExtensionsExample extends App{
  import MyExtensions._

  val t:Try[String] = Success("foo")
  println(t.toEither)
  val t2:Try[String] = Failure(new RuntimeException("bar"))
  println(t2.toEither)

  val e:Either[Throwable,String] = Right("foo")
  println(e.toTry)
  val e2:Either[Throwable,String] = Left(new RuntimeException("bar"))
  println(e2.toTry)
}

关于scala - 在Scala中可以尝试,反之亦然,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22532357/

10-12 06:31