web-dev-qa-db-ja.com

リストをセパレータと連結するhaskell関数はありますか?

リストの要素をセパレータで連結する機能はありますか?例えば:

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

返信ありがとうございます!

113

はい、 あります

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標準ごとに末尾の改行で終了する必要があるテキストファイルのシリアル化に役立ちます)

203
Niklas B.

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

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