인쇄물의 Real World Haskell, 4 장, 98 페이지에서words
접기를 사용하여 구현할 수 있는지 묻습니다 .
가능합니까? 그렇지 않다면 왜? 그렇다면 어떻게?
나는 다음과 같이 생각해 냈습니다. 각 비 공백은 출력 목록의 마지막 단어 앞에 붙어야하고 ( otherwise
가드 에서 발생합니다 ) 공란에 emtpy 단어를 추가해야합니다. 출력 목록이 이미 (이은으로 처리가없는 경우 if
- then
- else
).
myWords :: String -> [String]
myWords = foldr step [[]]
where
step x yss@(y:ys)
| x == ' ' = if y == "" then yss else "":yss
| otherwise = (x:y):ys
입력 문자열의 선행 공백으로 인해 문자열의 출력 목록에서 선행 빈 문자열이 하나 생성되므로이 솔루션은 잘못되었습니다.
위의 링크에서 다른 독자를 위해 제안 된 여러 솔루션을 살펴 보았고 많은 솔루션이 내 솔루션과 유사하게 작동하지만 일반적으로 폴드의 출력을 "사후 처리"(예 : tail
경우에 따라) 빈 선행 문자열입니다.
다른 접근법은 튜플 (실제로 쌍)을 사용하므로 접힘이 쌍을 처리하고 선행 / 후행 공간을 잘 처리 할 수 있습니다.
이러한 모든 접근 방식에서 foldr
(또는 다른 접기, 축소)는 상자에서 최종 출력을 제공하는 기능이 아닙니다. 항상 다른 방법으로 출력을 조정해야합니다.
따라서 초기 질문으로 돌아가서 words
폴드를 사용하여 실제로 (후행 / 선행 / 반복 공간을 올바르게 처리하는 방법으로) 구현할 수 있는지 묻습니다 . 접기 를 사용 한다는 것은 접기 기능이 가장 바깥 쪽 기능이어야 함을 의미합니다.
myWords :: String -> [String]
myWords input = foldr step seed input