Salut,
A la lecture de la signature de cette fonction, il semble qu'elle prend une liste de chaînes, la filtre (saute les chaînes entre "%" inclusivement et "\n" exclusivement) et ajoute cette liste filtrée à une liste donnée, pour produire une liste en sortie. C'est bien cela ?
Effectivement l'implémentation est très curieuse et on peut craindre qu'une récursivité associée à un foldl ne fera pas l'affaire. Cela ne peut sûrement que créer quelque chose d'assez monstrueux.
De plus, je ne vois pas l'intérêt de
head s == '%' && s == "%"
car le second membre du prédicat doit suffire. D'autre part, je vois que tu renverses la construction naturelle inversée du foldl par Si ce que tu veux faire est bien ce que j'ai écrit au début de la réponse, c'est intéressant car cela nécessite une sorte de fold mais ni foldl ne convient (il bâtit la liste naturellement à l'envers avec cons) et encore moins avec foldr qui traverse la liste dans le mauvais sens.
Voici un exemple qui fonctionne mais est très inefficace (il emploie ++) :
1 2 3 4 5 6 7
| myFilter xs acc = acc ++ fst (myFilter' xs) where
myFilter' strs = foldl select ([], True) strs
select (acc, b) str
| str == "%" = (acc, False)
| str == "\n" = ((acc++[str]), True)
| b == False = (acc, b)
| True = (acc++[str], True) |
Ici le booléen dans le couple sélectionne et désélectionne l'ajout des chaînes à la liste.
On pourrait voir à améliorer cela. Mais est-ce que j'ai bien compris ? Sinon, si tu as produit un code qui fonctionne, j'aimerais bien le voir... Merci.
Partager