Есть ли какая-нибудь функция haskell для объединения списка с разделителем? - PullRequest
110 голосов
/ 10 февраля 2012

Есть ли функция для объединения элементов списка с разделителем?Например:

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

Спасибо за любой ответ!

Ответы [ 4 ]

199 голосов
/ 10 февраля 2012

Да, есть :

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

intersperse является более общим:

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

Кроме того, для конкретного случая, когда вы хотите объединить с пробелом, есть unwords:

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

unlines работает аналогично, только то, что строки взрываются с использованием символа новой строки и что символ новой строки также добавляется в конец. (Это делает его полезным для сериализации текстовых файлов, которые в конце стандарта POSIX должны заканчиваться завершающим переводом строки)

2 голосов
/ 21 мая 2017

Не сложно написать однострочник с помощью Foldr

join sep xs = foldr (\a b-> a ++ if b=="" then b else sep ++ b) "" xs
join " " ["is","there","such","a","function","?"]
2 голосов
/ 04 марта 2016
joinBy sep cont = drop (length sep) $ concat $ map (\w -> sep ++ w) cont
1 голос
/ 04 февраля 2017

Если вы хотите написать свои собственные версии intercalate и 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)
...