[list] 목록을 구분 기호로 연결하는 haskell 기능이 있습니까?

목록의 요소를 구분 기호로 연결하는 기능이 있습니까? 예를 들면 다음과 같습니다.

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

답장을 보내 주셔서 감사합니다!



답변

예, 있습니다 :

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 표준에 따라 줄 바꿈 문자로 끝나야하는 텍스트 파일을 직렬화하는 데 유용합니다)


답변

폴더를 사용하여 하나의 라이너를 작성하는 것은 어렵지 않습니다.

join sep xs = foldr (\a b-> a ++ if b=="" then b else sep ++ b) "" xs
join " " ["is","there","such","a","function","?"]


답변

joinBy sep cont = drop (length sep) $ concat $ map (\w -> sep ++ w) cont


답변

누군가 관심이 있다면, 산재하고 intercalate의 구현에 대한 다른 아이디어 :

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

myIntercalate :: [a] -> [[a]] -> [a]
myIntercalate e xs = concat $ myIntersperse e xs

xs >>= f와 같습니다 concat (map f xs).


답변

당신은 당신의 자신의 버전을 쓰고 싶었다면 intercalateintersperse:

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)


답변