저는 하스켈 프로그래머입니다. (그리고 5 년 전 배운 작은 하스켈입니다.)하지만 처음에는 누산기 ("현재 단락")를 사용하여 함수의 자연 번역을 작성했습니다.) (난 그냥 명확성을 위해, 종류를 추가했습니다) 주위에 전달되는 :
는
type Line = String
type Para = [Line]
-- Takes a list of lines, and returns a list of paragraphs
paragraphs :: [Line] -> [Para]
paragraphs ls = paragraphs2 ls []
-- Helper function: takes a list of lines, and the "current paragraph"
paragraphs2 :: [Line] -> Para -> [Para]
paragraphs2 [] para = [para]
paragraphs2 ("":ls) para = para : (paragraphs2 ls [])
paragraphs2 (l:ls) para = paragraphs2 ls (para++[l])
이 작동 :
*Main> paragraphs ["Line 1", "Line 2", "", "Line 3", "Line 4"]
[["Line 1","Line 2"],["Line 3","Line 4"]]
그래서 그 해결책입니다. 그러나, 하스켈 경험
groupBy라고이 : 하나 개 관련 기능 등의 작업을 수행하는 라이브러리 함수는 거의 항상 있다는 것을 시사하고 거의 작동합니다
paragraphs3 :: [Line] -> [Para]
paragraphs3 ls = groupBy (\x y -> y /= "") ls
*Main> paragraphs3 ["Line 1", "Line 2", "", "Line 3", "Line 4"]
[["Line 1","Line 2"],["","Line 3","Line 4"]]
아차. 우리가 정말 필요한 것은 "splitBy"및 it's not in the libraries이지만, 우리는 나쁜 사람에게 자신을 필터링 할 수 있습니다
paragraphs4 :: [Line] -> [Para]
paragraphs4 ls = map (filter (/= "")) (groupBy (\x y -> y /= "") ls)
또는, 당신은 멋진하려는 경우, 당신은 인수 제거 할 수와 그것을 할 무의미한 방법 :
paragraphs5 = map (filter (/= "")) . groupBy (\x y -> y /= "")
내가 더 짧은 방법이 확신 해요.:-)
편집 : ephemient는 (not . null)
이 (/= "")
청소기보다라고 지적한다. 그래서 우리는
paragraphs = map (filter $ not . null) . groupBy (const $ not . null)
반복 (not . null)
강한 표시이다 쓸 수 우리 기능으로,이 아래 질문에 대해 답 지적으로 Data.List.Split module은 무엇이며이 밖으로 정말해야 추상입니다.
당신은 그것에 대한 참조가 있습니까? 하스켈 98 도서관 보고서 (http://www.cs.auckland.ac.nz/references/haskell/haskell-library-1.4-html/list.html) *는 평등 술어이지만, groupBy 함수. groupBy의 타입 시그니처에는 "Eq"제약이 없으므로 임의의 (전이?) 술어 함수로 작업해야한다고 제안합니다 ...이 방법으로 사용하는 것이 일반적입니다 : http : //www.haskell .org/haskellwiki/List_function_suggestions # Generalize_groupBy_and_friends – ShreevatsaR
'not '를 사용하고 싶습니다. '(== "")'을 사용하여 더 이상 무의미한'paragraphs = map (filter $ not. null)으로 이끌 것입니다. groupBy (const $ not. null)' – ephemient