Como comentó Rex, si desea esto solo para dos casos, entonces probablemente no tendrá ningún problema si deja el código tal como está. Sin embargo, si desea extraer un patrón común, puede escribir una función que divida una lista en una sublista de una longitud especificada (2 o 3 o cualquier otro número). Una vez que lo haga, solo usará map
para convertir cada lista de la longitud especificada en Vector
.
La función para dividir la lista no está disponible en la biblioteca F # (hasta donde puedo decir), por lo que tendrá que implementarla usted mismo. Se puede hacer más o menos así:
let divideList n list =
// 'acc' - accumulates the resulting sub-lists (reversed order)
// 'tmp' - stores values of the current sub-list (reversed order)
// 'c' - the length of 'tmp' so far
// 'list' - the remaining elements to process
let rec divideListAux acc tmp c list =
match list with
| x::xs when c = n - 1 ->
// we're adding last element to 'tmp',
// so we reverse it and add it to accumulator
divideListAux ((List.rev (x::tmp))::acc) [] 0 xs
| x::xs ->
// add one more value to 'tmp'
divideListAux acc (x::tmp) (c+1) xs
| [] when c = 0 -> List.rev acc // no more elements and empty 'tmp'
| _ -> failwithf "not multiple of %d" n // non-empty 'tmp'
divideListAux [] [] 0 list
Ahora, puede utilizar esta función para poner en práctica sus dos conversiones de esta manera:
seq { for [x; y] in floatList |> divideList 2 -> Vector2(x,y) }
seq { for [x; y; z] in floatList |> divideList 3 -> Vector3(x,y,z) }
Esto le dará una advertencia, porque estamos usando un incompleto patrón que espera que las listas devueltas sean de longitud 2 o 3 respectivamente, pero esa es la expectativa correcta, por lo que el código funcionará bien. También estoy usando una versión breve de expresión de secuencia->
hace lo mismo que do yield
, pero solo se puede usar en casos simples como este.
se ve bastante limpio para mí, no creo que se encontrará con un problema de mantenimiento –
Se puede escribir código genérico que podría agarrar N elementos y luego simplemente usar partido de seleccionar '' Vector3' o Vector2 '(según corresponda), pero ¿por qué? La sobrecarga sería más complicada de lo que tienes aquí. Ahora, si subes hasta 12, esa es otra historia ... –