秒差距条件

mat*_*ias 0 haskell parsec

如果我有一个解析器将一串由空格分隔的数字读取到整数列表中,那么如何处理尾随空格?目前我有:

\n
row :: Parser [Int]\nrow  = do\n  optional spaces\n  f <- (many (oneOf "0123456789"))\n  r <- ((char ' ') >> row) <|> pure []\n  pure (read f:r)\n
Run Code Online (Sandbox Code Playgroud)\n

对于没有尾随空格的字符串效果很好,但对于尾随空格则失败。

\n
>\xce\xbb= parse row "" " 2  0 12  3     7"\nRight [2,0,12,3,7]\n\n>\xce\xbb= parse row "" " 2  0 12  3     7  "\nRight [2,0,12,3,7,*** Exception: Prelude.read: no parse\n
Run Code Online (Sandbox Code Playgroud)\n

这个问题的解决方案是什么,更重要的是,我如何拥有 if'\\n'被消耗然后解析器返回的条件[]

\n

编辑:\n通过阅读@amalloy的答案和parsec源代码,我认为添加一个在这里工作的版本很有用(尽管,@amalloy的建议不要尝试滚动现有函数更有意义)

\n
row :: Parser [Int]\nrow = do\n  spaces\n  f <- (read <$> many1 digit)\n  do\n    many1 $ char ' '\n    r <- row\n    pure (f:r) <|> pure [x]\n  <|> pure []\n
Run Code Online (Sandbox Code Playgroud)\n

ama*_*loy 8

我建议不要自己实现所有这些低级的东西,而是使用sepEndBy. 例如,

row :: Parser [Int]
row = spaces *> (int `sepEndBy` many1 space)
  where int = read <$> many1 digit
Run Code Online (Sandbox Code Playgroud)