Есть ли функция haskell для объединения списка с разделителем?
есть ли функция для объединения элементов списка с разделителем? Например:
> foobar " " ["is","there","such","a","function","?"]
["is there such a function ?"]
Спасибо за любой ответ!
4 ответов
да здесь:
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 конце пустую строку)
Если вы хотите написать свои собственные версии 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)
нетрудно написать однострочный текст с помощью foldr
join sep xs = foldr (\a b-> a ++ if b=="" then b else sep ++ b) "" xs
join " " ["is","there","such","a","function","?"]