2009-10-21 2 views

Répondre

5

Si vous attendez de pouvoir "aplatir" List(1, 2, List(3,4), 5) dans List(1, 2, 3, 4, 5), alors vous besoin de quelque chose comme:

implicit def any2iterable[A](a: A) : Iterable[A] = Some(a) 

Avec:

val list: List[Iterable[Int]] = List(1, 2, List(3,4), 5) // providing type of list 
                 // causes implicit 
                 // conversion to be invoked 

println(list.flatten(itr => itr)) // List(1, 2, 3, 4, 5) 

EDIT: ce qui suit a été dans ma réponse initiale jusqu'à ce que l'OP clarifie sa question dans un commentaire sur la réponse de Mitch

Que faites-vous s'attendre à se produire lorsque vous flatten un List[Int]? Vous attendez-vous à ce que la fonction additionne les Int dans le List? Si oui, vous devriez regarder les nouvelles fonctions de aggegation dans 2.8.x:

val list = List(1, 2, 3) 
println(list.sum) //6 
+0

J'ai été intéressé par votre réponse originale. Pourtant, je ne peux pas comprendre pourquoi cela doit être si lourd. – IttayD

+1

lourd? Pourquoi essayez-vous d'aplatir une liste éventuellement plate? comment est-ce que scala est supposé savoir comment vous voulez aplatir une liste remplie de quelque chose? – geowa4

+0

def aplat (l: Liste [Tout]): Liste [Tout] = l flatMap { cas l: Liste [_] => aplatir (l); case e => Liste (e); } – IttayD

4

La documentation:

Concatenate the elements of this list. The elements of this list should be a Iterables. Note: The compiler might not be able to infer the type parameter.

Portez une attention particulière à cette deuxième phrase. Any ne peut pas être converti en Iterable[Any]. Vous pouvez avoir une liste de Int s, et cette liste ne peut pas être aplanie car Int n'est pas itérable. Et pensez-y, si vous avez List[Int], qu'est-ce que vous aplatissez? Vous avez besoin de List[B <: Iterable[Any]], car alors vous auriez deux dimensions, qui peuvent être aplaties à un.

+0

scala> val l = Liste (1, 2, Liste (3, 4)) l: Liste [Tous] = Liste (1, 2, Liste (3, 4)) est-ce que cela signifie que je ne peux pas aplatir la liste de Int? quelles listes puis-je aplatir alors? – IttayD

+0

* @ Ittay * - voir ma réponse - vous devez convertir le 'List [Any]' que vous avez fourni en 'List [Iterable [A]]' pour certains A. –

+0

vous pouvez aplatir une liste d'itérations, c'est-à-dire une liste de listes d'ints. – geowa4

Questions connexes