我正在尝试合并到包含在Option
:
val a = Option(Array(1, 2, 3))
val b = Option(Array(4,5))
val q = for {
x <- a
y <- b
} yield x ++ y
问题是如果b
为None
,则即使我想要None
,它也会返回a
。如果a
为None
,则编译器会抱怨++
不是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]]]
结果类型应与a
和b
的类型相同。
答案 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