我想解析一些文本,其中某些字段在大多数情况下具有结构但偶尔(由于特殊的大小写,拼写错误等),这种结构缺失。
E.g。常规案例为Cost: 5
,但有时会显示Cost: 5m
或Cost: 3 + 1 per ally
或其他随机内容。
在普通解析器(p)无法正常工作的情况下,我想回退到一个只将整行作为字符串的解析器。
为此,我想创建一个Parser a -> Parser b -> Either a b
类型的组合子。但是,我无法确定如何检查第一个解析器是否成功的结果,而不执行case parse p "" txt of ...
之类的操作。
我看不到组合器中的构建,但我确信有一些简单的方法可以解决这个问题,我很想知道
答案 0 :(得分:6)
我想你想要这样的东西
eitherParse :: Parser a -> Parser b -> Parser (Either a b)
eitherParse a b = fmap Left (try a) <|> fmap Right b
try
只是为了确保a
消耗某些输入然后失败,您将正确回溯。然后,您可以使用常规方法运行解析器以生成Either ParseError (Either a b)
很容易转换为Either a b
case parse p "" str of
Right (Left a) -> useA a
Right (Right b) -> useB b
Left err -> handleParserError err
答案 1 :(得分:-1)