Sto provando per la prima volta F # con poche conoscenze teoriche preliminari sulla programmazione funzionale.
Ho scritto una piccola funzione per calcolare una media mobile semplice su una lista. Eccolo:
let rec sma n data =
let length = List.length data
if length < n then data
else (sma n data.[..length-2]) @ [List.average data.[length - n .. ]]
Non ero molto soddisfatto di questo risultato. Sembra goffo e mi aspettavo una soluzione più elegante, ma non riuscivo a trovarne una. Poi ho avuto un'idea selvaggia e l'ho fatto all'indietro. Ho calcolato SMA iniziando da e verso la lista in primo piano:
let rec sma n data =
if List.length data < n then data
else List.average data.[.. n-1] :: sma n data.Tail
Questo è più ciò che mi aspettavo. Ma perché non posso farlo iterando dall'inizio?
Secondo la documentazione di F # ( link ), posso facilmente fare riferimento al primo elemento dell'elenco ( Head
) e al resto dell'elenco ( Tail
), e posso usare l'operatore ::
per creare un elenco aggiungendo un nuovo elemento all'inizio. Tuttavia, non ho un modo simile per riferirsi all'ultimo elemento, o alla lista senza l'ultimo elemento, né ho un operatore per la creazione di un elenco aggiungendo un nuovo elemento alla fine.
Perché c'è questa asimmetria? Ho imparato un po 'di Haskell all'università, e penso che fosse simmetrico dalla prospettiva.