在Scala中组合包装元素:选项[Array [Int]]

时间:2016-08-31 07:04:35

标签: scala

我正在尝试合并到包含在Option

中的数组
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)。这是可以使用标准库还是我必须查看Cats或Scalaz中的半群?

我在Cats中尝试过以下操作,但无法使其工作:

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

它告诉我:

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

结果类型应与ab的类型相同。

3 个答案:

答案 0 :(得分: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.

因此,可以将选项视为可迭代。

答案 1 :(得分:2)

保留类型Option[C[X]],其中C是某种集合类型,X是该集合的元素类型,我想出了:

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

答案 2 :(得分:0)

你应该能够做到

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