¿Convertir una lista de Scala en una tupla?
¿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?
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.
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)
}
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 toHList
método