我想为尖括号中逗号分隔的一对值编写一个解析器。我通过以下方法让它工作:
pair p1 p2 = do
x1 <- p1
comma
x2 <- p2
return (x1, x2)
data Foo = Foo (Bar, Bar)
foo :: Parser Foo
foo = Foo <$> (angles $ pair bar bar)
但是我更喜欢 Foo 构造函数采用两个参数而不是一个元组:
data Foo = Foo Bar Bar
编写这样的解析器的最佳方法是什么?理想情况下,我想重用标准秒差距解析器,例如angles
并尽可能使用应用性的。
编写这样的解析器的最佳方法是什么?理想情况下,我想重用标准秒差距解析器(例如角度)并尽可能多地使用应用程序。
在应用风格中,你的解析器将是
foo = angles $ Foo <$> bar <* comma <*> bar
从里到外,一个bar
被解析,然后comma
,被丢弃,另一个bar
,然后是构造函数Foo
应用于两个解析的bar
s。最后,所有内容都被包装到angles
组合器,这样形式的字符串
< bar , bar >
被解析(bar
可能应该消耗尾随空格)。
将忽略其中一个结果的解析器与*>
and <*
应用组合器消除了对pair
组合器,并且可以轻松推广到采用任意数量参数的构造函数。
As C.A.麦肯 https://stackoverflow.com/users/157360/c-a-mccann在评论中提到,(<$)
组合器(这是 GHC 实现的一部分Functor
类,具有默认实现(<$) = fmap . const
;但它不是语言标准的一部分)如果您想忽略前导标记,也很有用。使用它,你可以写
Foo <$ ignoreMe <*> bar <* comma <*> baz
这比使用括号更好
Foo <$> (ignoreMe *> bar) <* comma <*> baz
or pure
,
pure Foo <* ignoreMe <*> bar <* comma <*> baz
没有它就需要某种形式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)