webentwicklung-frage-antwort-db.com.de

Gibt es eine Hash-Funktion, um die Liste mit dem Trennzeichen zu verknüpfen?

Gibt es eine Funktion zum Verketten von Elementen einer Liste mit einem Trennzeichen? Beispielsweise:

> foobar " " ["is","there","such","a","function","?"]
["is there such a function ?"]

Danke für jede Antwort!

113

Ja, gibt es :

Prelude> import Data.List
Prelude Data.List> intercalate " " ["is","there","such","a","function","?"]
"is there such a function ?"

intersperse ist etwas allgemeiner:

Prelude> import Data.List
Prelude Data.List> concat (intersperse " " ["is","there","such","a","function","?"])
"is there such a function ?"

Für den speziellen Fall, dass Sie sich mit einem Leerzeichen verbinden möchten, gibt es auch unwords :

Prelude> unwords ["is","there","such","a","function","?"]
"is there such a function ?"

unlines funktioniert ähnlich, nur dass die Zeichenfolgen mit dem Zeilenumbruchzeichen implodiert werden und dass am Ende auch ein Zeilenumbruchzeichen hinzugefügt wird. (Dies macht es nützlich für die Serialisierung von Textdateien, die gemäß POSIX-Standard mit einem abschließenden Zeilenumbruch enden müssen.)

203
Niklas B.

Es ist nicht schwer, Einzeiler mit foldr zu schreiben

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

Wenn Sie Ihre eigenen Versionen von intercalate und intersperse schreiben wollten:

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