2012-01-23 3 views
2

다음 기능이 왜 동일하게 작동하지 않습니까? 첫 번째는 적절한 문자열 분할을하고 있지만, 두 번째는 무한 목록을왜이 두 코드는 똑같이 동작하지 않습니까?

오른쪽 코드 생성, 영원히 ""계속 추가 할 것 같다

my_split :: [Char]->Char->[[Char]] 
my_split [] _ = [[]] 
my_split lista y 
    | notElem y lista=[lista] 
    | otherwise=isMatch:(my_split rest y) 
    where 
      isMatch=takeWhile (/=y) lista 
      rest=tail $ dropWhile (/=y) lista 

잘못된 코드 :

my_split :: [Char]->Char->[[Char]] 
my_split [] _ = [[]] 
my_split lista y 
    | notElem y lista=[lista] 
    | otherwise=isMatch:(my_split rest y) 
    where 
    (isMatch,rest)=break (==y) lista 

유일한 다른 부분은 휴식 조건이며 실제로 나에게도 똑같은 일을해야하는 것처럼 보입니다. 첫 번째 함수 형식은 내 결과에 빈 목록을 추가하지 않도록해야합니다 ... noobish에 대해 죄송합니다. 사전에 질문 및 감사

답변

6
GOA> break (=='c') "abcde" 
("ab","cde") 
GOA> break (=='c') "cde" 
("","cde") 
GOA> 

break 일치하는 문자는 제거되지 않습니다. 작동 첫 번째 버전에서

3
break p xs = (takeWhile (not . p) xs, dropWhile (not . p) xs) 

, 당신은 dropWhile의 결과에 tail을 적용합니다.

작동하지 않는 두 번째 버전에서는이를 수행하지 않습니다.

2

다른 설명처럼, break는 takeWhile 및 dropWhile 쌍을 반환합니다. 너는 방울의 꼬리를 잡고 싶다. 다음과 같이 할 수 있습니다.

where 
(isMatch,_:rest)=break (==y) lista 
관련 문제