gpt4 book ai didi

scala - 选项和选项有什么区别?

转载 作者:行者123 更新时间:2023-12-03 14:34:10 25 4
gpt4 key购买 nike

根据documentation :

A common use of Either is as an alternative to Option for dealing with possible missing values.



你为什么要使用一个而不是另一个?

最佳答案

Either 的好处是您可以跟踪缺少某些内容的原因。例如,如果您正在使用 Options ,你可能会遇到这样的情况:

val xOpt = Option(1)
val yOpt = Option(2)
val zOpt = None

val tupled = for {
x <- xOpt
y <- yOpt
z <- zOpt
} yield (x, y, z)

现在,如果 tupledNone ,我们真的不知道为什么!如果这是其余行为的重要细节,请使用 Either能够帮助:
val tupled = for {
x <- xOpt.toRight("x is missing").right
y <- yOpt.toRight("y is missing").right
z <- zOpt.toRight("z is missing").right
} yield (x, y, z)

这将返回 Left(msg)其中消息是第一个缺失值的对应消息,或 Right(value)对于元组值。按照惯例继续使用 Left对于失败和 Right为成功。

当然也可以使用 Either更广泛地说,不仅在具有缺失值或异常值的情况下。还有其他情况 Either可以帮助表达简单联合类型的语义。

用于异常值的第三个常用习语是 Try单子(monad):
val xTry = Try("1".toInt)
val yTry = Try("2".toInt)
val zTry = Try("asdf".toInt)

val tupled = for {
x <- xTry
y <- yTry
z <- zTry
} yield (x, y, z)
Try[A]Either[Throwable, A] 同构.换句话说,您可以处理 Try作为 Either左侧类型为 Throwable ,你可以对待任何 Either左侧类型为 Throwable作为 Try .还有 Option[A]Try[A] 同态.所以你可以对待 Option作为 Try忽略错误。因此,您也可以将其视为 Either .事实上,标准库支持其中一些转换:
//Either to Option
Left[Int, String](1).left.toOption //Some(1)
Right[Int, String]("foo").left.toOption //None

//Try to Option
Try("1".toInt).toOption //Some(1)
Try("foo".toInt).toOption //None

//Option to Either
Some(1).toRight("foo") //Right[String, Int](1)
(None: Option[Int]).toRight("foo") //Left[String, Int]("foo")

标准库不包括来自 Either 的转换。至 Try , 来自 TryEither ,或来自 OptionTry .但是丰富起来很简单 Option , Try , 和 Either如所须:
object OptionTryEitherConversions {
implicit class EitherToTry[L <: Throwable, R](val e: Either[L, R]) extends AnyVal {
def toTry: Try[R] = e.fold(Failure(_), Success(_))
}

implicit class TryToEither[T](val t: Try[T]) extends AnyVal {
def toEither: Either[Throwable, T] = t.map(Right(_)).recover(PartialFunction(Left(_))).get
}

implicit class OptionToTry[T](val o: Option[T]) extends AnyVal {
def toTry(throwable: Throwable): Try[T] = o.map(Right(_)).getOrElse(Left(throwable))
}
}

这将允许您执行以下操作:
import OptionTryEitherConversions._

//Try to Either
Try(1).toEither //Either[Throwable, Int] = Right(1)
Try("foo".toInt).toEither //Either[Throwable, Int] = Left(java.lang.NumberFormatException)

//Either to Try
Right[Throwable, Int](1).toTry //Success(1)
Left[Throwable, Int](new Exception).toTry //Failure(java.lang.Exception)

//Option to Try
Some(1).toTry(new Exception) //Success(1)
(None: Option[Int]).toTry(new Exception) //Failure(java.lang.Exception)

关于scala - 选项和选项有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29682208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com