Le rose de tes messages me pique presque autant les yeux que ton respect de l'orthographe.
Ceci étant mentionné, tu souhaites donc définir map et filter sans utiliser de fold. La réponse est : laisse-toi guider par les types !
map :: (a -> b) -> [a] -> [b]
Tu as une fonction qui transforme un a en b, une liste de a, et tu veux en faire une liste de b. Tu vas devoir traiter chaque élément de la liste un par un. Pour cela, tu vas utiliser une définition avec un filtrage de motifs :
1 2
| map f [] = error "TODO"
map f (a::as) = error "TODO" |
Il te reste à remplir le code.
Sur la première ligne, tu reçois une liste vide, et tu dois retourner une liste de b, que comptes-tu faire ?
Pour la seconde ligne tu reçois une liste contenant un a et une sous-liste de a. Tu vas devoir effectuer un appel récursif de la fonction map. J'espère que tu sais ce que c'est.
Pour filter il en va de même, on regarde le type :
filter :: (a -> Bool) -> [a] -> [a]
Tu procèdes encore une fois par récursivité et analyse de cas :
1 2
| filter cond [] = error "TODO"
filter cond (a::as) = error "TODO" |
Ici, dans le cas du bas, tu vas devoir effectuer un test, et renvoyer un résultat différent selon ce que le test retourne.
Un choix est d'utiliser une structure de la forme :
Un autre choix est d'utiliser une garde, ce qui peut être plus simple à lire :
1 2 3
| filter cond [] = error "TODO"
filter cond (a::as) | ... = error "TODO"
filter cond (a::as) | otherwise = error "TODO" |
Si tu ne connais pas les gardes, ce n'est pas grave, tu devrais quand même pouvoir écrire filter avec le patron sans gardes.
Partager