Como ya se ha señalado, este es un problema complicado, porque tupla no es un solo tipo - es una familia de tipos, tales como int * int * int
o int * int
y F # no proporciona ninguna manera para tomar la totalidad familia de tipos como argumento Puedes escribir muchas funciones similares (lo cual es muy incómodo) o usar la reflexión (que es un poco lenta y no es segura para el tipo de letra).
Alternativamente, podría limitar la función a tuplas con cierta estructura; por ejemplo, en lugar de trabajar con (1, 2, 3, 4)
, podría usar tuplas anidadas como (1, (2, (3, 4)))
. Esto es un poco menos cómodo, pero mantiene el tipo de seguridad y no es tan malo.
A continuación, puede escribir fácilmente combinadores para la construcción de funciones de conversión sobre la marcha:
// creates function for converting tuple (possibly with a nested
// tuple in the second component to list
let tl f (a, b) = a::(f b)
// converts last element of the tuple to singleton list
let te a = [a]
A continuación, se puede combinar funciones tl
y te
para crear una función de tipo seguro que convierte tupla anidada que contiene 4 elementos a una lista de esta manera:
let l = (1, (2, (3, 4))) |> (tl (tl (tl te)))
del mismo modo, puede crear funciones para convertir la lista de tuplas - en cuenta que esto puede producir una excepción si la lista no coincide con el formato esperado:
let le = function
| [x] -> x
| _ -> failwith "incompatible"
let lt f = function
| [] -> failwith "incompatible"
| x::xs -> (x, f xs)
// convert list to a tuple of four elements
let t = [1; 2; 3; 4] |> lt (lt (lt le))
Supongo que esto es probablemente lo más parecido a la función segura y reutilizable para convertir entre tuplas y listas, ya que puede obtener. No es perfecto (en absoluto), pero eso se debe al hecho de que está tratando de implementar una operación muy poco utilizada. En F #, la distinción entre tuplas y listas es más clara que, por ejemplo, en Python (que es dinámico, por lo que no tiene que tratar con la seguridad de tipo estático).
Esto va a ser un problema difícil precisamente porque las tuplas deben dimensionarse estáticamente mientras que las listas deben dimensionarse dinámicamente. Creo que la respuesta de sepp2k es probablemente la mejor si realmente necesita una solución así ... defina una función para cada tamaño hasta el tamaño de lista más grande que necesite y luego elija la función para llamar en función de la longitud de la lista. –