Объединение 2 вариантов в 1

Есть ли в Scala предопределенная функция x, которая объединяет 2 параметра, чтобы

Some(a) x None => Some(a)
None x Some(b) => Some(b)
None x None => None

person Jens Schauder    schedule 13.01.2013    source источник
comment
А если у вас есть Some(a) и Some(b)?   -  person Alex DiCarlo    schedule 13.01.2013
comment
Такой случай не может произойти в том, что я делаю, поэтому мне все равно, каков будет результат.   -  person Jens Schauder    schedule 13.01.2013


Ответы (3)


Да, это метод orElse. Он выбирает первое определенное значение или None, если ни одно из них не определено.

scala> Some(1) orElse None
res0: Option[Int] = Some(1)

scala> None orElse Some(1)
res1: Option[Int] = Some(1)

scala> None orElse None
res2: Option[Nothing] = None

scala> Some(1) orElse Some(2)
res3: Option[Int] = Some(1)
person Ben James    schedule 13.01.2013

Это не сложно сделать своими руками:

scala> val a = Some(1)
a: Some[Int] = Some(1)

scala> val b = Some(2)
b: Some[Int] = Some(2)

scala> Seq(a,b).flatten.headOption
res0: Option[Int] = Some(1)
person om-nom-nom    schedule 13.01.2013
comment
Или просто (a ++ b).headOption. - person Erik Kaplun; 13.02.2014

В комментариях к вопросу вы упоминаете, что у вас не может быть Some(a) и Some(b), поэтому на самом деле у вас есть Option[Either[Int,Int]]. В этом случае вы можете использовать x.map(_.merge), чтобы вернуться к Option[Int], например

scala> val x:Option[Either[Int,Int]] = Some(Left(2))
x: Option[Either[Int,Int]] = Some(Left(2))

scala> x.map(_.merge)
res0: Option[Int] = Some(2)
person Kristian Domagala    schedule 13.01.2013
comment
Это очень хороший момент. Подозрительно использовать тип, у которого явно есть обитатели, которых не может быть. - person Ben James; 17.03.2013
comment
это может не сработать так хорошо, если у него есть две функции возврата Option[T], или будет? - person Erik Kaplun; 13.02.2014
comment
Моя точка зрения заключалась в том, что если два Some случая не могут произойти, то было бы лучше закодировать это в системе типов. Если имеется 2 значения Option[T], то следует предположить, что они оба могут быть Some. Ответ orElse, который дал Бен, отдает приоритет одному варианту над другим, что может быть правильным. Однако использование Option[Either[T,T]] устраняет необходимость принимать это решение. - person Kristian Domagala; 13.02.2014