Implementa le operazioni di base sugli array.
Nei linguaggi funzionali, le operazioni sugli array come length, map e reduce sono molto comuni.
Implementa una serie di operazioni di base sugli array, senza usare le funzioni esistenti.
Il numero preciso e i nomi delle operazioni da implementare dipenderà dal track, per evitare conflitti con i nomi già esistenti, ma le operazioni generali che implementerai includono:
append (dati due array, aggiungi tutti gli elementi del secondo array alla fine del primo array);concatenate (data una serie di array, combina tutti gli elementi di tutti gli array in un unico array appiattito);filter (dati un predicato e un array, restituisci l'array di tutti gli elementi per cui predicate(item) è True);length (dato un array, restituisci il numero totale di elementi che contiene);map (date una funzione e un array, restituisci l'array dei risultati dell'applicazione di function(item) a tutti gli elementi);foldl (date una funzione, un array e un accumulatore iniziale, piega (riduci) ogni elemento nell'accumulatore da sinistra);foldr (date una funzione, un array e un accumulatore iniziale, piega (riduci) ogni elemento nell'accumulatore da destra);reverse (dato un array, restituisci un array con tutti gli elementi originali, ma in ordine inverso).Nota: l'ordine in cui gli argomenti vengono passati alle funzioni fold (foldl, foldr) è significativo.
Implementare queste operazioni sulle liste senza usare alcuna funzione integrata è praticamente impossibile in Roc, perché serve un modo per aggiungere elementi in coda o in testa a una lista.
In altri linguaggi potresti usare operatori come : in Haskell o += in Python, ma in Roc devi usare le funzioni di List.
Quindi per questo esercizio puoi usare List.append (ma evita di usare qualsiasi altra funzione integrata).
Molti linguaggi di programmazione funzionale usano le liste concatenate come tipo di collezione principale.
In una lista concatenata è efficiente aggiungere un elemento in testa o estrarre il primo elemento, quindi in quei linguaggi implementeresti le operazioni sulle liste con List.prepend.
In Roc, invece, una List è un array (un blocco contiguo di byte).
Gli array hanno proprietà diverse dalle liste concatenate, come la capacità di accedere in modo efficiente agli elementi tramite indice e di aggiungere nuovi elementi in coda.
Per questo motivo, in Roc usiamo spesso List.append e raramente List.prepend.
Roc usa nomi leggermente diversi da quelli elencati nelle istruzioni generali:
concat invece di append
join invece di concatenate
len invece di length
fold invece di foldl
fold_rev invece di foldr
Tuttavia, i seguenti nomi di funzione sono standard in Roc:
filtermapreverseProva a usare:
match list {
[] => ...
[first, .. as rest] => ...
}
oppure
match list {
[] => ...
[.. as rest, last] => ...
}
Iscriviti a Exercism per imparare e padroneggiare Roc con 126 esercizi e il mentoring di persone reali, tutto gratis.
Goditi un'introduzione pratica alla ricorsione, esplora le alternative imperative e funzionali a Operazioni su array e approfondisci la ricorsione in coda e le funzioni di accumulo.