2016-08-31 57 views
3

我試圖結合到被包裹在一個Option數組:Scala中結合包裹元件:選項[數組[INT]]

val a = Option(Array(1, 2, 3)) 
val b = Option(Array(4,5)) 
val q = for { 
    x <- a 
    y <- b 
} yield x ++ y 

的問題是,如果是bNone它返回None甚至雖然我想有a。如果aNone,編譯器會抱怨++不是Nothing的成員(儘管我期望收到b)。這是可以用標準庫嗎?還是必須查看貓或斯卡拉斯的半羣?

我試着在貓以下,但不能得到它的工作:

Semigroup[Option[Array[Int]]].combine(a,b) // === a |+| b 

它告訴我說:

could not find implicit value for parameter ev: cats.kernel.Semigroup[Option[Array[Int]]] 

產生的類型應該是相同類型的ab

+0

我試圖用a ++ b直接在repl中,它適用於兩種情況,即a = None或b = None。 – Samar

回答

2

保存類型Option[C[X]],其中C一些集合類型和X是該集合的元素類型,我想出了:

a.fold(b)(x => b.fold(a)(y => Option(x ++ y))) 
+0

我添加了返回類型:與a和b基本相同。 – Ian

0

你應該能夠做到

val q = a.toList.flatten ++ b.toList.flatten 
+3

(a ++ b).flatten也適用。 – Samar

3
(a ++ b).flatten.toArray 

++方法不是Option類的一部分,但由於隱式轉換,它在此處起作用。如果您看到scala doc for Option,它表示This member is added by an implicit conversion from Option[A] to Iterable[A] performed by method option2Iterable in scala.Option.

因此,選項可以被視爲可迭代的。