Haskell 解析器分隔符

Haskell Parser Seperator

我正在使用 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

我搜索了一个合适的解析器组合器,但唯一接近的组合器是 sepBy,它不适用于此用例。感谢您的帮助!

我认为最好的选择是引入你自己的操作符,例如:

infixl 4 <:>
p <:> q = p <* char ':' <*> q

那你就不用单独定义parse函数了,直接写实现就好了:

myParser = f <$> pa <:> pb <:> pc <:> pd

这很容易扩展:

myParser2 = g <$> pa <:> pb <:> pc <:> pd <:> pe