2017-08-10 477 views
1

我希望三个Seq的笛卡尔乘积(斯卡拉)。其中任何一个都可以是空的。我知道任何具有空集的Set的笛卡尔积都是空集。我想要提供一个默认值(下面例子中的“”)。这是骨架代码。带空的笛卡尔乘积(组合)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的问题是它返回一个PartialFunction,我放弃了映射或flatMap的功能。

+1

'e < - if(empty.isEmpty)Seq(“”)else empty'? – Dima

+0

谢谢!陷入orElse和其他令人困惑的东西 –

回答

2

如果您的默认值是事先知道的,您可以创建一个默认值的单个元素的列表:

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)) 
}