Haskell 解析器分隔符

Lan*_*o-L 4 parsing haskell parsec

我正在使用 Parsec 为日志文件编写解析器。该日志文件的每一行都遵循通用结构,A:B:C:D其中组件 A、B、C 和 D 遵循简单的规则。我已经为每个组件编写了解析器,我想将它们组合成一个解析器。我目前的方法有效,但我觉得必须有更好的解决方案。一个直接的缺点是,对于包含超过 4 个组件的日志文件,它无法很好地扩展。

parser :: (a -> b -> c -> d -> e) -> Parser a -> Parser b -> Parser c -> Parser d -> Parser e
parser f pa pb pc pd = f <$> pa <* (char ':') <*> pb <* (char ':') <*> pc <* (char ':') <*> pd
Run Code Online (Sandbox Code Playgroud)

我搜索了合适的解析器组合器,但唯一接近的组合器是sepBy,它不适用于此用例。任何帮助表示赞赏!

Nou*_*are 6

我认为最好的选择是引入自己的运营商,例如:

infixl 4 <:>
p <:> q = p <* char ':' <*> q
Run Code Online (Sandbox Code Playgroud)

那么你不需要定义单独的parse函数,编写实现也同样容易:

myParser = f <$> pa <:> pb <:> pc <:> pd
Run Code Online (Sandbox Code Playgroud)

这很容易扩展:

myParser2 = g <$> pa <:> pb <:> pc <:> pd <:> pe
Run Code Online (Sandbox Code Playgroud)