2017-08-10 3 views
1

3つのSeqのデカルト積(スカラー)を希望します。いずれも空にすることができます。空集合が空集合である任意の集合のデカルト積を知っています。私はデフォルト値(以下の例では "")を指定することを回避したいと思います。ここにスケルトンコードがあります。空のSeqのデカルト積(組み合わせ)

これまでのところ、リフトとorElse(Seq( ""))を試しました。 orElseの問題は、それがPartialFunctionを返し、マップまたはフラットマップの能力が失われてしまうことです。

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