web-dev-qa-db-fra.com

Existe-t-il une fonction haskell pour concaténer une liste avec un séparateur?

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!

113

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)

203
Niklas B.

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","?"]
3
Ilya Kharlamov
joinBy sep cont = drop (length sep) $ concat $ map (\w -> sep ++ w) cont
2
Alaya

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)
1
Zoey Hewll