2013-01-13 53 views
15

有Scala中的一個預定義的函數x,結合2個選項使得結合2個選項成1

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

,當你有一些'(一)'和'部分(B)'關於什麼的? –

+0

這種情況不會發生在我正在做的事情上,所以我不在乎結果是什麼。 –

回答

39

,這是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) 
3

不難手工做:

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) 
+3

或者只是'(a ++ b).headOption'。 –

3

在問題的評論,你提到你不能有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) 
+1

這是一個很好的觀點。這是可疑的使用一種類型,顯然有居民,「不可能發生」 –

+0

這可能不會發揮如此出色,雖然如果他有兩個'Option [T]'返回功能,或者它會嗎? –

+2

我的觀點更多的是*如果*兩個'Some''' *不能*發生,那麼在類型系統中編碼會更好。如果有2個'Option [T]'值,那麼必須假定它們都可以是'Some'。 Ben給出的「orElse」答案優先於另一個選項,這可能是有效的。使用Option [雖然[T,T]]儘管不需要做出該決定。 –