2013-04-28 2 views
0

내 함수에 문제가 있습니다. 문자열을 내 함수와 패턴 일치시키고 싶지만 문자열을 부분 문자열로 분리하는 데 문제가 있습니다. 나는 "ccaabbccaacc"과 같은 문자열과 "a*b*c*"과 같은 정규 표현을 사용하여 바운드 서브 링이있는 목록 인 ["cc", "aabbcc", "aacc", ""]을 얻고 싶습니다. 나는 문자열문자열을 하위 문자열로 나누기 haskell

parts :: [a] -> [[[a]]] 
parts [ ] = [[ ]] 
parts [c] = [[[c]]] 
parts (c : cs) = concat [[(c : p) : ps ,[c] : p : ps] | p : ps <- parts cs] 

의 모든 부분을 반환이 기능을 만들었습니다하지만 적용 할 때 내 matchs는 내가 원하는 것을 더 반환하고 난 결과를 필터링하는 방법을 모른다 명백한 모든 결과를 작동합니다. somene는 나를 도울 수 있습니까?

+1

여기에서와 같이 이러한 문제를 쉬운 단계로 나누는 것이 일반적으로 좋은 생각이지만 작업을 완전히 수행하는 하나의 재귀 함수를 작성하는 것이 더 효과적인 사례라고 생각합니다. 그걸 시도 했니? – leftaroundabout

+0

나는 재귀 적으로 작업을 시도했지만 작동하지 않았다. – user192837465

답변

1

나는이 질문이 파싱에 관한 것인가 - 문자열을 주어진 정규 표현식과 일치하는 최대 청크로 나누고 싶다고 생각합니다. "알파벳*".

이것은 반복적 인 렉서 응용 프로그램과 같으며 regexp에서만 가능합니다.

regexp와 문자열 입력 문자열을 사용하고, 가장 긴 일치 접두어 한 쌍의 입력 문자열의 나머지를 반환
reglex :: String -> String -> (String, String) 

, 우리는

import Control.Arrow 

parts reg str = ($ ("",str)) $ 
    iterate (reglex reg . snd) >>> 
    tail >>> 
    span (not.null.fst) 

을 쓸 수 함수의 존재를 가정하고 그 결과로 무언가를하십시오.

+0

하스켈은 하나의 특정 문자열에서 두 개의 지정된 인덱스 사이의 부분 문자열을 추출하기위한 내장 함수를 가지고 있습니까? –

+1

우리는'splitAt'을 반복적으로 적용하여 이렇게 할 수 있습니다 :'ij str = let (a, b) = splitAt i str; (c, d) = splitAt (j-i) b (c '는 0부터 시작하여'j '를 포함하지 않는다). "btw i j s = fst"로 "단순화 된". splitAt (j-i). snd. splitAt i $ s'라고합니다. –

관련 문제