Parsing 为什么解析器组合器是;以下是;定义为“;绑定";及;return";?
我正在阅读关于解析器组合器的文章,但不理解以下内容: 他们说,使用Parsing 为什么解析器组合器是;以下是;定义为“;绑定";及;return";?,parsing,haskell,functional-programming,Parsing,Haskell,Functional Programming,我正在阅读关于解析器组合器的文章,但不理解以下内容: 他们说,使用seq(见下文)会产生结果为嵌套元组的解析器,这很难操作 不幸的是,我不明白嵌套元组的问题是什么,也不明白为什么seq的第二个实现比第一个更好。你能帮我理解一下吗?第一个例子扩展到类型((a,b),(c,d,e)): 虽然不是更好,但我想你可以看到第二个界面更干净。我敢说,应用程序界面实际上比一元界面旧。不幸的是,最近几年才得到更多的关注 其思想是,使用seqcombinator(不是一个幸运的名称),基本解析器返回一个“简单”类
seq
(见下文)会产生结果为嵌套元组的解析器,这很难操作
不幸的是,我不明白嵌套元组的问题是什么,也不明白为什么
seq
的第二个实现比第一个更好。你能帮我理解一下吗?第一个例子扩展到类型((a,b),(c,d,e)):
虽然不是更好,但我想你可以看到第二个界面更干净。我敢说,应用程序界面实际上比一元界面旧。不幸的是,最近几年才得到更多的关注 其思想是,使用
seq
combinator(不是一个幸运的名称),基本解析器返回一个“简单”类型的值,然后将其组合成一个更复杂类型的最终结果
应用程序接口的思想是拥有一个类型为的顺序组合组合器
(<*>) :: Parser (b -> a) -> Parser b -> Parser a
这最终解释了为什么应该尽可能避免使用monad(就像在上下文无关语法过度使用时应该使用正则表达式一样)。第二个也不是更好,除了
bind
和return
(因此它适用于所有monad)之外,您不需要任何东西。如果您尝试编写一个由3个解析器组成的序列,然后使用seq
然后使用do
符号;,您就会看到元组的问题。)顺便说一句,在这种情况下,大多数人现在都会使用较新的Applicative
组合词:seq232((p,q),(r,s,t))=(,)((,)pq)((,)rst)
@rjanJohansen我正试图理解Applicative
解析器组合词,但无法理解它。因此,我提出了一个新问题:
p ‘seq‘ q = p ‘bind‘ \x -> q ‘bind‘ \y -> result (x,y)
seq232 ((p,q),(r,s,t) = \inp ->
[ (((v,w),(x,y,z)),inp’’''')
| (v, inp’) <- p inp
, (w, inp’’) <- q inp’
, (x, inp''') <- r inp''
, (y, inp'''') <- s inp'''
, (z, inp''''') <- t imp''''
]
seq232 ((p,q),(r,s,t)) =
p ‘bind‘ \v ->
q ‘bind‘ \w ->
r `bind` \x ->
s `bind` \y ->
t `bind` \z ->
result ((v,w),(x,y,z))
(<*>) :: Parser (b -> a) -> Parser b -> Parser a
pS = (max . (+1)) <$ pSym '(' <*> pS <* pSym ')' <|> pure 0
pAs = length <$> many(pSym 'a')
pSyms c 0 = pure 0
pSyms c n = (+1) <$ pSym c <*> pSyms c (n-1)
pABC = do count <- pAs
pSyms 'b' count
pSyms 'c' count
@inproceedings{SwieDupo96,
Author = {Swierstra, S. D. and Duponcheel, L.},
Booktitle = {Advanced Functional Programming},
Date-Added = {2009-01-04 17:21:54 +0100},
Date-Modified = {2009-01-04 17:21:54 +0100},
Editor = {Launchbury, John and Meijer, Erik and Sheard, Tim},
Pages = {184-207},
Publisher = {Springer-Verlag},
Series = {LNCS-Tutorial},
Title = {Deterministic, Error-Correcting Combinator Parsers},
Urlpdf = {http://www.cs.uu.nl/people/doaitse/Papers/1996/DetErrCorrComPars.pdf},
Volume = {1129},
Year = {1996},
}