用于从两个选项中获取单个选项的惯用scala,如果有两个选项则抛出异常

And*_*idy 2 monads scala scala-option

val one: Option[Int] = None    
val two = Some(2)

Option(one.getOrElse(two.getOrElse(null))) // Gives me Some(2) which I want

val one = Some(1)
val two = None

Option(one.getOrElse(two.getOrElse(null))) // Gives me Some(1) which I want

val one: Option[Int] = None
val two: Option[Int] = None

Option(one.getOrElse(two.getOrElse(null))) // Gives me None which I want

val one = Some(1)
val two = Some(2)

Option(one.getOrElse(two.getOrElse(null))) // Gives me Some(1) when I want an exception
Run Code Online (Sandbox Code Playgroud)

我简要地研究了Either类型,但它似乎是"表示两种可能类型之一的值".我错过了一些数据结构还是Monad?基本上我想要一个显式的(并且如果两者都有价值则抛出错误)如果可用则获得一个或获得无

gwe*_*zek 10

我不知道有任何预制的,所以这是一个功能:

def xor[T](x: Option[T], y: Option[T]): Option[T] = (x, y) match {
    case (Some(_), None) => x
    case (None, Some(_)) => y
    case (None, None) => None
    case _ => throw new Exception()
}
Run Code Online (Sandbox Code Playgroud)