Comment définiriez-vous la carte et le filtre à l'aide de foldr en Haskell?

Je suis en train de faire un peu d'auto-étude sur les langages fonctionnels (actuellement à l'aide de Haskell). Je suis tombé sur un Haskell affectation qui exige la définition de la carte et le filtre en termes de foldr. Pour la vie de moi je ne suis pas entièrement comprendre comment aller à ce sujet.

Par exemple quand je définis une fonction map comme:

map'            :: (a -> b) -> [a] -> [b]
map' f []       = []
map' f (x:xs)   = foldr (\x xs -> (f x):xs) [] xs

Je ne sais pas pourquoi le premier élément de la liste est toujours ignoré. Ce qui signifie que:

map' (*2) [1,2,3,4]

résultats dans [4,6,8] au lieu de [2,4,6,8]

De même, mon filtre de la fonction:

filter'             :: (a -> Bool) -> [a] -> [a]
filter' p []        = []
filter' p (x:xs)    = foldr (\x xs -> if p x then x:xs else xs ) [] xs

quand exécuter en tant qu':

filter' even [2,3,4,5,6]

résultats dans [4,6] au lieu de [2,4,6]

Pourquoi serait-ce le cas? Et comment dois-je avoir défini ces fonctions pour obtenir les résultats attendus? Je suis en supposant que quelque chose est incorrect avec mes expressions lambda...

InformationsquelleAutor klactose | 2011-04-20