목록의 요소를 구분 기호로 연결하는 기능이 있습니까? 예를 들면 다음과 같습니다.
> 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)
.
답변
당신은 당신의 자신의 버전을 쓰고 싶었다면 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)