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


131

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

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

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


13
나는 lmgtfy 답변이 나쁘다는 것을 알고 있지만 hoogle에서 "String-> [String]-> String"을 검색하면 원하는 것을 얻을 수 있습니다. haskell.org/hoogle
sigfpe

3
공백으로 가입을 위해 당신은 또한이unwords
epsilonhalbe

1
@sigfpe Side comment : [String] -> String -> String다른 방법으로 응답이없는 경우 찾아야합니다 .
Lay González

1
@ LayGonzález 검색은 순열입니다. 예를 들어 검색 은 첫 번째 결과로 [a] -> (a -> b) -> [b]반환 map됩니다.
gallais 2016 년

답변:


228

예, 있습니다 :

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


빈 문자열을 처리 할 수 ​​있습니까?
CMCDragonkai

3
@CMCDragonkai 정확히 무슨 말을하는지 확실하지는 않지만, 예,이 함수들은 모두 구분자와 요소 모두로 임의의 문자열을 허용합니다. 예를 들어, intercalate "," ["some", "", "string"] = "some,,string"intercalate "" ["foo", "bar"] = "foobar"
니클라스 B.

3
unlines각 줄에 개행을 추가합니다. 즉 unlines ["A", "B"] = "A\nB\n", intercalate와 같지 않습니다.
캐시 반 스톤

@KathyVanStone 흥미롭게도, 나는 결코 시도하지 않았고 그것이 비슷하게 작동한다고 가정했습니다 unwords.
Niklas B.

1
표준 라이브러리에는 일반적인 문자열 및 목록 조작 함수가 있다는 것이 좋으며, Haskell에서 일상적인 프로그래밍에 대한 문서를 찾기가 어렵 기 때문에 여기에 예제를 게시하는 것이 좋습니다.
앤드류 코스터

4

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

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

3
이에 대한 설명을 추가하는 것이 좋습니다. 누군가 품질이 낮은 것으로 신고했습니다.
Arya McCarthy

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

3

누군가 관심이 있다면, 산재하고 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).


2

당신은 당신의 자신의 버전을 쓰고 싶었다면 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)

1
왜 자신을 현으로 제한합니까? 또한 함수 응용 프로그램에 대한 사용자의 중복은 중복됩니다.
melpomene

사실, intersperse필요하지 Strings,하지만 intercalate적어도 될 필요가있을 것이다 Show, 당신이 경우 사용을 Show, 당신은 사용하여 처리 할 수있는 방법이 필요 했어 String들에게 어쨌든. 나는 아직도 하스켈 혼합 중위와 접두사 기능 / 연산자를 다루는 방법에 익숙해있어, 나는 내가 사용하고자 끝날 경우에 혼합 할 때 브라켓 선호$
싶을 Zoey Hewll

intercalate :: [a] -> [[a]] -> [a]Show? 구문에 관해서는 Haskell에는 접두사 연산자가 없으며 ( -가장 혐오 인 경우 제외 ) 함수 응용 프로그램 은 모든 접두사 연산자 보다 꽉 묶 x:s:intersperse s xs습니다. 그러나 공백을 넣으면 훨씬 잘 읽습니다.x : s : intersperse s xs (I 돈 사람들이 왜 주변 공간을 남기고 싶어하는지 이해하지 못합니다 :.)).
melpomene

권리. 문자열로 작업하는 것은 목록으로 작업하는 것만 잊어 버립니다.Show결과가을 원한다고 가정했기 때문 String입니다. "접두사 및 접두사 함수 / 연산자"란 "접두사 함수 및 접두사 연산자"를 의미했지만 명확하지 않았습니다. 단항 -은 죽음입니다. 에 관해서 :의 다른 중위 사업자, 내가 공간을 사용하는지 여부 것은 매우 상황에 따라 달라집니다,하지만 난 항상 로컬 일관성입니다. 예를 들어, (:)패턴 일치에서 공백이없는 경우가 있지만 다른 곳에서는 괄호와 기분에 따라 달라집니다.
Zoey Hewll
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.