Esercizi Pratici: Funzioni e Lambda
In questa sezione applichiamo le tecniche funzionali più importanti apprese nel capitolo: Template generici, Deduzione dei tipi (auto) e Funzioni Lambda con cattura.
Esercizio 1: Implementare fold generico
Section titled “Esercizio 1: Implementare fold generico”Il costrutto fold (noto anche come reduce o accumulate) è uno dei mattoni della programmazione funzionale. La funzione scorre una sequenza di elementi comprimendola in un singolo valore finale tramite un accumulatore e una funzione binaria (la Lambda).
Requisiti:
Section titled “Requisiti:”- Implementa il template
foldcon la seguente firma:template <typename Fn, typename In, typename Out>constexpr Out fold(Fn function, In* input, size_t length, Out initial); - Ad ogni passo, aggiorna l’accumulatore invocando:
accumulatore = function(accumulatore, elemento_corrente). - Nel
main, usa la funzionefoldimplementata per calcolare:- La somma di tutti gli elementi (iniziale
0) - Il valore massimo
- Il valore minimo
- Il numero di elementi maggiori di 200
- La somma di tutti gli elementi (iniziale
Esercizio 2: Implementare all generico (Predicato)
Section titled “Esercizio 2: Implementare all generico (Predicato)”In programmazione funzionale, un predicato è una funzione che accetta un valore e restituisce un booleano (true/false). Il costrutto all verifica se tutti gli elementi di una sequenza soddisfano un dato predicato.
Requisiti:
Section titled “Requisiti:”- Implementa il template
allcon la seguente firma:template <typename Fn, typename In>constexpr bool all(Fn function, In* input, size_t length); - Applica la tecnica del cortocircuito (short-circuit): non appena un elemento fallisce il test (
!function(input[i])), interrompi immediatamente il ciclo restituendofalsesenza iterare inutilmente i restanti elementi. - Se tutti gli elementi soddisfano la condizione, restituisci
true.