2012-12-04 3 views
16

J'ai une structure de n-uplets imbriqués comme (String,(String,Double)) et je veux la transformer en (String,String,Double). J'ai différents types de tuple imbriqués, et je ne veux pas les transformer manuellement. Y a-t-il un moyen pratique de le faire?Comment aplatir un tuple imbriqué?

Répondre

6

Il n'y a pas d'aplatissement sur un Tupple. Mais si vous connaissez la structure, vous pouvez faire quelque chose comme ceci:

implicit def flatten1[A, B, C](t: ((A, B), C)): (A, B, C) = (t._1._1, t._1._2, t._2) 
implicit def flatten2[A, B, C](t: (A, (B, C))): (A, B, C) = (t._1, t._2._1, t._2._2) 

Cela va aplatir Tupple avec tous les types. Vous pouvez également ajouter le mot clé implicite à la définition. Cela ne fonctionne que pour trois éléments. Vous pouvez aplatir Tupple comme:

(1, ("hello", 42.0)) => (1, "hello", 42.0) 
(("test", 3.7f), "hi") => ("test", 3.7f, "hi") 

multiples imbriquées Tupple ne peut pas être plaquer au sol, car il n'y a que trois éléments du type de retour:

((1, (2, 3)),4)  => (1, (2, 3), 4)