我正在阅读《Haskell 编程》,第 8 章,作者给出了一个编写解析器的例子。完整的来源在这里:http ://www.cs.nott.ac.uk/~gmh/Parsing.lhs
我无法理解以下部分:many
允许零个或多个应用程序p
,而many1
需要至少一个成功的应用程序:
many :: Parser a → Parser [a ]
many p = many1 p +++ return [ ]
many1 :: Parser a → Parser [a ]
many1 p = do v ← p
vs ← many p
return (v : vs)
递归调用如何发生在
vs <- many p
vs
是 的结果值many p
,但是调用了很多 p many1 p
,many1
在其定义中都有一个 do 表示法,并且再次有结果值v
,并且vs
,递归调用什么时候返回?为什么以下代码段可以返回[("123","abc")]
?
> parse (many digit) "123abc"
[("123", "abc")]