具有空 Seq 的笛卡尔积(组合)
Cartesian product (combinations) with empty Seq
我想要 scala 中三个 Seq 的笛卡尔积(组合)。它们中的任何一个都可以为空。我知道任何带有空集的集合的笛卡尔积都是空集。我想要提供一个默认值(下例中的“”)。这是框架代码。
val letters = Seq("a", "b")
val numbers = Seq("1")
val empty: Seq[String] = Nil
// Desired output = Seq(("a", "1", ""), ("b", "1", ""))
// Cartesian product
// What I'm trying which returns List()
for {
l <- letters
n <- numbers
e <- empty
} yield {
(l, n, e)
}
到目前为止,我已经尝试了 lift 和 orElse(Seq(""))。 orElse 的问题是它 returns 是一个 PartialFunction 并且我失去了映射或 flatMap 的能力。
如果您的默认值事先已知,您可以使用默认值创建单个元素的列表:
def nonEmptyOrDefault[A](xs: Seq[A], default: A): Seq[A] =
if (xs.isEmpty) Seq(default)
else xs
for {
l <- nonEmptyOrDefault(letters, "")
n <- nonEmptyOrDefault(numbers, "")
e <- nonEmptyOrDefault(empty, "")
} yield (l, n, e)
或者你可以使用保证非空的集合
class NESeq[+A] private (private val xs: Iterable[A]) {
// TODO implement flatMap, map, ++, etc.
}
object NESeq {
def fromIterable[A](xs: Iterable[A]): Option[NESeq[A]] =
if (xs.isEmpty) None
else Some(new NESeq(xs))
}
我想要 scala 中三个 Seq 的笛卡尔积(组合)。它们中的任何一个都可以为空。我知道任何带有空集的集合的笛卡尔积都是空集。我想要提供一个默认值(下例中的“”)。这是框架代码。
val letters = Seq("a", "b")
val numbers = Seq("1")
val empty: Seq[String] = Nil
// Desired output = Seq(("a", "1", ""), ("b", "1", ""))
// Cartesian product
// What I'm trying which returns List()
for {
l <- letters
n <- numbers
e <- empty
} yield {
(l, n, e)
}
到目前为止,我已经尝试了 lift 和 orElse(Seq(""))。 orElse 的问题是它 returns 是一个 PartialFunction 并且我失去了映射或 flatMap 的能力。
如果您的默认值事先已知,您可以使用默认值创建单个元素的列表:
def nonEmptyOrDefault[A](xs: Seq[A], default: A): Seq[A] =
if (xs.isEmpty) Seq(default)
else xs
for {
l <- nonEmptyOrDefault(letters, "")
n <- nonEmptyOrDefault(numbers, "")
e <- nonEmptyOrDefault(empty, "")
} yield (l, n, e)
或者你可以使用保证非空的集合
class NESeq[+A] private (private val xs: Iterable[A]) {
// TODO implement flatMap, map, ++, etc.
}
object NESeq {
def fromIterable[A](xs: Iterable[A]): Option[NESeq[A]] =
if (xs.isEmpty) None
else Some(new NESeq(xs))
}