Is there any haskell function to concatenate list with separator?

前端 未结 5 1528
庸人自扰
庸人自扰 2020-12-07 16:06

Is there a function to concatenate elements of a list with a separator? For example:

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


        
相关标签:
5条回答
  • 2020-12-07 16:40
    joinBy sep cont = drop (length sep) $ concat $ map (\w -> sep ++ w) cont
    
    0 讨论(0)
  • 2020-12-07 16:42

    Some other ideas of implementations of intersperse and intercalate, if someone is interested:

    myIntersperse :: a -> [a] -> [a]
    myIntersperse _ [] = []
    myIntersperse e xs = init $ xs >>= (:[e])
    
    myIntercalate :: [a] -> [[a]] -> [a]
    myIntercalate e xs = concat $ myIntersperse e xs
    

    xs >>= f is equivalent to concat (map f xs).

    0 讨论(0)
  • 2020-12-07 16:44

    It's not hard to write one-liner using foldr

    join sep xs = foldr (\a b-> a ++ if b=="" then b else sep ++ b) "" xs
    join " " ["is","there","such","a","function","?"]
    
    0 讨论(0)
  • 2020-12-07 16:57

    Yes, there is:

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

    intersperse is a bit more general:

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

    Also, for the specific case where you want to join with a space character, there is unwords:

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

    unlines works similarly, only that the strings are imploded using the newline character and that a newline character is also added to the end. (This makes it useful for serializing text files, which must per POSIX standard end with a trailing newline)

    0 讨论(0)
  • 2020-12-07 17:01

    If you wanted to write your own versions of intercalate and 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)
    
    0 讨论(0)
提交回复
热议问题