Estoy buscando una manera de crear una secuencia que consta de cada enésimo elemento de otra secuencia, pero no parece encontrar una manera de hacerlo de una manera elegante. Por supuesto, puedo hackear algo, pero me pregunto si hay una función de biblioteca que no estoy viendo.Obteniendo cada enésimo elemento de una secuencia
Las funciones de secuencia cuyos nombres terminan en -i parecen ser bastante buenas para determinar cuándo un elemento es el enésimo o (múltiplo de n) uno, pero solo puedo ver iteri
y mapi
, ninguno de lo cual realmente se presta a la tarea.
Ejemplo:
let someseq = [1;2;3;4;5;6]
let partial = Seq.magicfunction 3 someseq
Entonces partial
debería ser [3;6]
. ¿Hay algo así por ahí?
Editar:
Si no soy tan ambicioso y permitir la n
a ser constante/conocido, entonces me acaba de encontrar que el siguiente debería funcionar:
let rec thirds lst =
match lst with
| _::_::x::t -> x::thirds t // corrected after Tomas' comment
| _ -> []
Would ¿Hay alguna forma de escribir esto más corto?
Puede usar 'mapi' para convertir cada elemento de la lista en' Some' o 'None',' filtrar' fuera '' '' '' '' '' '' '' '', y luego 'map' de nuevo al tipo no decorado. –
Su solución usando listas se ve bien (pero es probable que desee escribir '_ :: _ :: x :: t' (en lugar de' (_, _, x) :: t' que usa una lista de tuplas). La diferencia es que 'Seq' funcionará con otras colecciones que listas, pero puede que no sea un problema para ti. Tu versión con listas es un buen código funcional. –
Sí, por supuesto, debe ser' _ :: _ :: x :: t', debería haberle preguntado al compilador antes de pegarlo aquí. –