¿Convertir una lista de Scala en una tupla?

Resuelto grautur asked hace 11 años • 14 respuestas

¿Cómo puedo convertir una lista con (digamos) 3 elementos en una tupla de tamaño 3?

Por ejemplo, digamos que tengo val x = List(1, 2, 3)y quiero convertir esto a (1, 2, 3). ¿Cómo puedo hacer esto?

grautur avatar Feb 06 '13 13:02 grautur
Aceptado

No puedes hacer esto de forma segura. ¿Por qué? Porque en general no podemos saber la longitud de una lista hasta el tiempo de ejecución. Pero la "longitud" de una tupla debe estar codificada en su tipo y, por lo tanto, debe conocerse en el momento de la compilación. Por ejemplo, (1,'a',true)tiene el tipo (Int, Char, Boolean), que es azúcar para Tuple3[Int, Char, Boolean]. La razón por la que las tuplas tienen esta restricción es que deben poder manejar tipos no homogéneos.

Tom Crockett avatar Feb 06 '2013 06:02 Tom Crockett

Puedes hacerlo usando extractores Scala y coincidencia de patrones ( enlace ):

val x = List(1, 2, 3)

val t = x match {
  case List(a, b, c) => (a, b, c)
}

que devuelve una tupla

t: (Int, Int, Int) = (1,2,3)

Además, puede utilizar un operador comodín si no está seguro del tamaño de la lista.

val t = x match {
  case List(a, b, c, _*) => (a, b, c)
}
kikulikov avatar Feb 14 '2014 00:02 kikulikov

un ejemplo usando sin forma :

import shapeless._
import syntax.std.traversable._
val x = List(1, 2, 3)
val xHList = x.toHList[Int::Int::Int::HNil]
val t = xHList.get.tupled

Nota: el compilador necesita cierta información de tipo para convertir la Lista en HList, razón por la cual necesita pasar información de tipo al toHListmétodo

evantill avatar Feb 06 '2013 11:02 evantill