我正在通过 Write You a Haskell 工作,并且我正在他实现“Nanoparsec”的部分,这是一个来自第一原理的 Haskell 解析器。我被困在Alternative
解析器的实例上,特别是some
和many
实现:
instance Alternative Parser where
-- empty = ...
-- (<|>) p q = ...
some v = some_v
where
many_v = some_v <|> pure []
some_v = (:) <$> v <*> many_v
many v = many_v
where
many_v = some_v <|> pure []
some_v = (:) <$> v <*> many_v
我不知道这两个函数在做什么。从我所见,some
获取一个解析器,应用它,然后连接结果,直到输入用完。但many
看起来它做同样的事情。这里发生了什么事?