Aller au contenu

Projet – Filter Map Reduce génériques

Construisez une petite bibliothèque de fonctions génériques d’ordre supérieur : Filter, Map et Reduce. Ce sont des utilitaires courants de programmation fonctionnelle. Utilisez des paramètres de type et des contraintes.

Ce projet démontre :

  • Les fonctions génériques
  • Les types fonction comme paramètres
  • L’inférence de type
package main
import "fmt"
// Filter retourne une nouvelle slice contenant uniquement les éléments pour lesquels pred retourne true.
func Filter[T any](slice []T, pred func(T) bool) []T {
resultat := make([]T, 0, len(slice))
for _, v := range slice {
if pred(v) {
resultat = append(resultat, v)
}
}
return resultat
}
// Map transforme chaque élément de la slice en utilisant la fonction transform.
func Map[T, U any](slice []T, transform func(T) U) []U {
resultat := make([]U, len(slice))
for i, v := range slice {
resultat[i] = transform(v)
}
return resultat
}
// Reduce combine les éléments de la slice en utilisant la fonction accumulateur.
func Reduce[T, U any](slice []T, initial U, accumulateur func(U, T) U) U {
resultat := initial
for _, v := range slice {
resultat = accumulateur(resultat, v)
}
return resultat
}
func main() {
nombres := []int{1, 2, 3, 4, 5, 6}
// Filter les nombres pairs
pairs := Filter(nombres, func(n int) bool { return n%2 == 0 })
fmt.Println("Pairs :", pairs)
// Map : élever au carré chaque nombre
carres := Map(nombres, func(n int) int { return n * n })
fmt.Println("Carrés :", carres)
// Reduce : somme de tous les nombres
somme := Reduce(nombres, 0, func(acc, n int) int { return acc + n })
fmt.Println("Somme :", somme)
// Combinaison : somme des carrés des nombres pairs
resultat := Reduce(
Filter(nombres, func(n int) bool { return n%2 == 0 }),
0,
func(acc, n int) int { return acc + n*n },
)
fmt.Println("Somme des carrés des pairs :", resultat)
}
Fenêtre de terminal
Pairs : [2 4 6]
Carrés : [1 4 9 16 25 36]
Somme : 21
Somme des carrés des pairs : 56