Existe-t-il une fonction permettant de concaténer les éléments d'une liste avec un séparateur? Par exemple:
> foobar " " ["is","there","such","a","function","?"]
["is there such a function ?"]
Merci pour toute réponse!
Oui, il y a :
Prelude> import Data.List
Prelude Data.List> intercalate " " ["is","there","such","a","function","?"]
"is there such a function ?"
intersperse
est un peu plus général:
Prelude> import Data.List
Prelude Data.List> concat (intersperse " " ["is","there","such","a","function","?"])
"is there such a function ?"
En outre, dans le cas spécifique où vous souhaitez rejoindre un espace, il existe unwords
:
Prelude> unwords ["is","there","such","a","function","?"]
"is there such a function ?"
unlines
fonctionne de la même façon, sauf que les chaînes sont implosées à l'aide du caractère de nouvelle ligne et qu'un caractère de nouvelle ligne est également ajouté à la fin. (Cela le rend utile pour la sérialisation des fichiers texte, qui doivent se terminer par une nouvelle ligne suivant la norme POSIX)
Il n’est pas difficile d’écrire sur une seule ligne à l’aide de foldr
join sep xs = foldr (\a b-> a ++ if b=="" then b else sep ++ b) "" xs
join " " ["is","there","such","a","function","?"]
joinBy sep cont = drop (length sep) $ concat $ map (\w -> sep ++ w) cont
Si vous voulez écrire vos propres versions de intercalate
et intersperse
:
intercalate :: [a] -> [[a]] -> [a]
intercalate s [] = []
intercalate s [x] = x
intercalate s (x:xs) = x ++ s ++ (intercalate s xs)
intersperse :: a -> [a] -> [a]
intersperse s [] = []
intersperse s [x] = [x]
intersperse s (x:xs) = x : s : (intersperse s xs)