2014-12-30 1 views
0

정수리스트가 임의의 길이 일 수있는 경우 파일에서 쉼표로 분리 된 정수리스트를 파싱하는 데 도움이 필요합니다. 문자열은 "1,2,3,4,5,6,7,8, ..."과 같을 수 있으며, 필요한 목록은 [1,2,3,4,5,6,7, 8, ...].Haskell Attoparsec으로 정수리스트를 분석하십시오.

0,0:1; -- minimum of 1 integer after the : 
0,1:1,2; 
0,2:5; 
0,3:5,16,223,281; -- any amount of integers can follow the : 
... 

내 파서는 현재 하나 개의 정수를 읽지 만 더를 읽기 시작해야합니다 : 같은

파일 형식 보인다. 나는 ByteString에 모든 숫자를 읽을 takeTill를 사용할 수 있지만, 나는 정확히 모르고 같은 문제를 가진 또 다른 문자열을 구문 분석 할 필요가 얼마나 많은 숫자가 될 수 있습니다

parseTile :: Parser Tile 
parseTile = do 
    x <- decimal 
    char ',' 
    y <- decimal 
    char ':' 
    --t <- takeTill (\x -> x == ';') 
    t <- decimal 
    char ';' 
    return $ Tile x y t 

내가 this를 찾았지만 내 파일이 json 파일이 아니기 때문에 저를 도와주지 않습니다.

+0

당신은, 당신은''(','문자)'''commaSepInts = 소수점'sepBy1' 뭔가를 얻을 수 있습니다 *'콤비은'sepBy 봐야한다 '; '''row = commaSepInts'sepBy1' (char ':')'''. 이것이 당신의 모든 문제를 해결할 지 모르겠지만'sepBy'는 아마 당신이 찾고있는 것일 것입니다. – bheklilr

+0

@bheklilr 감사합니다 bheklilr, sepBy가 실제로 해결책이었습니다. – user3638162

답변

3

당신은 사용할 수 있습니다 sepBydecimal :

parseTile :: Parser Tile 
parseTile = do 
    x <- decimal 
    char ',' 
    y <- decimal 
    char ':' 
    t <- decimal `sepBy` (char ',') 
    char ';' 
    return $ Tile x y t 
+0

감사합니다. 나는 쉬운 대답이 있어야한다는 것을 알았지 만, 나는 그것에 손가락을 대지 못했습니다. – user3638162