1) Pour écrire la fonction sommeFiltre, nous allons utiliser la fonction de filtrage de Haskell, filter, qui prend en entrée une fonction booléenne et une liste, et retourne une nouvelle liste ne contenant que les éléments de la liste initiale pour lesquels la fonction booléenne retourne True. Nous allons donc filtrer les entiers de 1 à n en utilisant la fonction f, puis nous allons utiliser la fonction de somme de Haskell, sum, pour calculer la somme des entiers filtrés.
Voici le code correspondant :
sommeFiltre :: Int -> (Int -> Bool) -> Int
sommeFiltre n f = sum (filter f [1..n])
2) Pour écrire la fonction parfait, nous allons utiliser la fonction sommeFiltre que nous avons écrite précédemment. Nous allons définir une fonction booléenne qui prend en entrée un entier n, et retourne True si n est un nombre parfait, et False sinon. Pour déterminer si un nombre est parfait, nous allons filtrer les diviseurs de n en utilisant la fonction filter, puis nous allons utiliser la fonction sum pour calculer la somme de ces diviseurs. Si cette somme est égale à 2n, alors n est un nombre parfait.
Voici le code correspondant :
estParfait :: Int -> Bool
estParfait n = sum (filter (\x -> n `mod` x == 0) [1..n-1]) == n * 2
parfait :: Int -> Bool
parfait n = estParfait n
3) Pour écrire la fonction parfaits, nous allons utiliser la fonction parfait que nous avons écrite précédemment, ainsi que la fonction filter pour filtrer les entiers de 0 à n. Nous allons donc filtrer les entiers de 0 à n en utilisant la fonction parfait, puis nous allons retourner la liste des entiers filtrés.
Voici le code correspondant :
parfaits :: Int -> [Int]
parfaits n = filter parfait [0..n]