Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 为什么解析器组合器是;以下是;定义为“;绑定";及;return";?_Parsing_Haskell_Functional Programming - Fatal编程技术网

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},
}