Sto cercando un modo per creare una sequenza composta da ogni ennesimo elemento di un'altra sequenza, ma non sembra trovare un modo per farlo in modo elegante. Ovviamente posso modificare qualcosa, ma mi chiedo se esiste una funzione di libreria che non vedo.Ottenere ogni ennesimo elemento di una sequenza
Le funzioni di sequenza i cui nomi finiscono in -i sembrano essere abbastanza buona con lo scopo di capire quando un elemento è l'ennesimo o (multiplo di n) esimo uno, ma posso vedere solo iteri
e mapi
, nessuno di cui si presta davvero al compito.
Esempio:
let someseq = [1;2;3;4;5;6]
let partial = Seq.magicfunction 3 someseq
Poi partial
dovrebbe essere [3;6]
. C'è qualcosa di simile là fuori?
Edit:
Se io non sono abbastanza ambiziosi e consentire la n
essere costante/conosciuto, poi ho appena trovato che il seguente dovrebbe funzionare:
let rec thirds lst =
match lst with
| _::_::x::t -> x::thirds t // corrected after Tomas' comment
| _ -> []
Would ci sarà un modo per scrivere questo più breve?
Puoi usare 'mapi' per trasformare ogni elemento della lista in un' Some' o un 'None',' filter' fuori 'None's, e poi 'mappa' di nuovo sul tipo non decorato. –
La tua soluzione usando le liste sembra buona (ma probabilmente vuoi scrivere '_ :: _ :: x :: t' (invece di' (_, _, x) :: t' che usa la lista di tuple). è che 'Seq' funzionerà con altre raccolte rispetto alle liste, ma potrebbe non essere un problema per te. La tua versione con liste è un bel codice funzionale. –
Sì, certo, deve essere' _ :: _ :: x :: t', avrebbe dovuto chiedere al compilatore prima di incollarlo qui. –