Parsing 无法理解';pMany';和';pMany1';在解析器组合器中

Parsing 无法理解';pMany';和';pMany1';在解析器组合器中,parsing,haskell,combinators,Parsing,Haskell,Combinators,我试图理解解析器组合器中的pMany和pMany1函数 newtype Parser s t = P([s] -> [(t, [s])]) pMany, pMany1 :: Parser s a → Parser s [a] pMany p =(:) <$> p <*> pMany p `opt` [] pMany1 p = (:) <$> p <*> pMany p newtype解析器st=P([s]->[(t[s])) pMany

我试图理解解析器组合器中的pMany和pMany1函数

newtype Parser s t = P([s] -> [(t, [s])])
pMany, pMany1 :: Parser s a → Parser s [a] 
pMany p =(:) <$> p <*> pMany p `opt` [] 
pMany1 p = (:) <$> p <*> pMany p
newtype解析器st=P([s]->[(t[s]))
pMany,pMany1::解析器s a→ 语法分析器s[a]
pMany p=(:)p pMany p`opt`[]
pMany1 p=(:)p pMany p
据我所知,pMany尽可能多次运行解析器,并在[a]中收集最终结果。我不明白的是,它如何在每次跑步之间跟踪结果。应用程序组合是上下文无关的,不应记住两者之间的状态。对吗

非常感谢

让我们把它分解一下

pMany p = (:) <$> p <*> pMany p `opt` [] 


pMany1
执行相同的操作,但如果无法解析第一个元素,则会失败。请注意,它在没有此属性的后面调用
pMany
。因此,我们强制它至少解析一个东西(“解析一个,然后解析任何数字”)。

这些函数和更多函数可以是状态转换器:
newtype Parser st=p([s]->[(t[s]))通过StateT[s]派生(Functor、Applicative、Alternative、Monad、MonadPlus、MonadState[s])
。这将为您提供
pMany=many
pMany1=some
。更多像
MonadFail
MonadFix
这样的实例可用,请在运行
后参考ghci命令:set-XPartialTypeSignatures-Wno partial-type signatures
,以列出它们,
f x
必须记住从
f
返回的函数,才能调用从
x
返回的值,否?你不能用
f
改变语法,但你肯定可以改变结果。基本上,到目前为止解析的元素都存储在闭包中,即
[s]->[(t[s])]
函数。谢谢大家!我想我现在明白了。我错过了的定义,它是P p1 P p2=P(\input->[(v1 v2,ss2)|(v1,ss1)很好的答案。现在我完全理解了。非常感谢!
pMany p = (fmap (:) p <*> pMany p) `opt` [] 
pMany p = (do
    someElem <- p
    restElems <- pMany p
    return (someElem : restElems)
  ) `opt` []