创建解析器类型的解析器组合器 - >解析器b - >解析器(任一ab)

Squ*_*dly 3 parsing haskell parsec

我想解析一些文本,其中某些字段在大多数情况下具有结构但偶尔(由于特殊的大小写,拼写错误等),这种结构缺失.

例如,常规情况是Cost: 5,但偶尔会读Cost: 5mCost: 3 + 1 per ally或其他一些随机的东西.

在普通解析器(p)无法工作的情况下,我想回退到一个解析器,它只将整行作为字符串.

为此,我想创建一个类型的组合器Parser a -> Parser b -> Either a b.但是,我无法弄清楚如何检查第一个解析器是否成功的结果,而不是做类似的事情case parse p "" txt of ....

我看不到组合器中的构建,但我确信有一些简单的方法可以解决这个问题,我错过了

Dan*_*zer 6

我想你想要这样的东西

eitherParse :: Parser a -> Parser b -> Parser (Either a b)
eitherParse a b = fmap Left (try a) <|> fmap Right b
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)