2012-12-04 20 views
16

Ho una struttura tupla annidata come (String,(String,Double)) e voglio trasformarla in (String,String,Double). Ho vari tipi di tuple annidate e non voglio trasformarle manualmente. C'è un modo conveniente per farlo?Come appiattire una tupla annidata?

risposta

6

Non c'è un appiattimento su un Tupple. Ma se si conosce la struttura, si può fare qualcosa di simile:

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) 

Ciò appiattire Tupple con qualsiasi tipo. È inoltre possibile aggiungere la parola chiave implicita alla definizione. Funziona solo per tre elementi. È possibile appiattire Tupple come:

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

multipla nidificato Tupple non può essere appiattire al suolo, perché ci sono solo tre elementi nel tipo di ritorno:

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