2017-08-10 1 views
1

Je voudrais le produit cartésien (combinaisons) de trois Seqs en scala. L'un d'eux peut être vide. Je sais que le produit cartésien de n'importe quel Set avec l'ensemble Vide est l'ensemble vide. Je voudrais un travail autour de fournir une valeur par défaut ("" dans l'exemple ci-dessous). Voici le code du squelette. Jusqu'à présent, j'ai essayé lift et orElse (Seq ("")). Le problème avec orElse est qu'il retourne une fonction partielle et je perds la possibilité de mapper ou flatmap.Produit cartésien (combinaisons) avec Seq vide

+1

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

+0

merci! Se laisser prendre dans orElse et d'autres choses confuses –

Répondre

2

Si votre valeur par défaut est connu à l'avance, vous pouvez créer une liste d'un seul élément avec la valeur par défaut:

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) 

Ou vous pouvez utiliser une collection qui assure non vide

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