Haskell使用Attoparsec解析整数列表

Haskell使用Attoparsec解析整数列表,haskell,attoparsec,Haskell,Attoparsec,当整数列表可以是任意长度时,我需要从文件中解析逗号分隔的整数列表的帮助。字符串可能看起来像“1,2,3,4,5,6,7,8,…”,我需要的列表可能像[1,2,3,4,5,6,7,8,…] 文件格式如下所示: 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 : ... 我的解析器目前只读取一个整数,但它需要开始

当整数列表可以是任意长度时,我需要从文件中解析逗号分隔的整数列表的帮助。字符串可能看起来像“1,2,3,4,5,6,7,8,…”,我需要的列表可能像[1,2,3,4,5,6,7,8,…]

文件格式如下所示:

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 :
...
我的解析器目前只读取一个整数,但它需要开始读取更多。我可以使用takeTill将所有数字读入ByteString,但随后我必须解析另一个字符串,同样的问题是不知道可以有多少个数字:

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

x您可以使用
sebby
decimal

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

x您可以使用
sebby
decimal

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

x您应该查看
sebby*
组合符,您可以得到类似于
commaSepInts=decimal`sebby1`(char',')
row=commaSepInts`sepBy1`(char':')
。不确定这是否解决了您的所有问题,但您可能正在寻找
sebby
。@bheklillr谢谢bheklillr,sebby确实是解决方案。您应该看看
sebby*
组合符,您可以得到类似于
commaSepInts=decimal`sebby1`(char',')
row=commaSepInts`sepBy1`(char':')
。不确定这是否解决了您的所有问题,但
sebby
可能是您正在寻找的。@bheklillr谢谢bheklillr,sebby确实是解决方案。谢谢。我知道必须有一个简单的答案,但我无法确定。谢谢。我知道必须有一个简单的答案,但我无法确定。