私はHaskellでのプログラミングを読んでいます.8章で、著者はパーサーを書く例を挙げています。完全なソースはここにあります: http://www.cs.nott.ac.uk/~gmh/Parsing.lhs次
の部分が理解できません: のmany
0 個以上のアプリケーションを許可しますが、少なくとも 1 つの成功したアプリケーションが必要です: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
すべてdo 記法があり、再び結果値 があります。そして、再帰呼び出しはいつ戻るのでしょうか? 次のスニペットが返されるのはなぜですか?many1
v
vs
[("123","abc")]
> parse (many digit) "123abc"
[("123", "abc")]