2017-08-10 478 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)) 
}