Voilà ce que j'aurais écrit pour replace :
1 2 3 4 5 6 7 8 9 10
|
replace :: String -> String -> String -> String
replace [] _ _ = []
replace s [] substitute = intercalate substitute (map (\x -> [x]) s)
replace (c:cs)@s pattern substitute
| sbegin == pattern = substitute ++ (replaceRec srest)
| otherwise = c : (replaceRec cs)
where
replaceRec s = replace s pattern substitute
(sbegin, srest) = splitAt (length pattern) s |
Ca me semble plus simple à lire que ce que tu écrivais. Notamment, je déconstruis la liste par pattern-matching, plutôt qu'avec des tests comme null str et des appels à head et tail. En général, on n'utilise pas ces fonctions comme tu le fais.
Quant à intercalate, son type est http://www.haskell.org/hoogle/?hoogle=intercalate :
intercalate :: [a] -> [[a]] -> [a]
Le deuxième argument doit être une liste d'éléments du type du premier. Aussi, tu dois transformer "bar" en ["b", "a", "r"]. C'est ce que fait le (map (\x -> [x]) s) dans mon code. J'aurais pensé qu'une telle fonction existait, mais je ne l'ai pas trouvée.
Partager