我一直在寻找在haskell写一个词法分析器,我偶然发现了这些功能。
如果定义,一些和许多应该是最少的解决方案 等式:
some v = (:) <$> v <*> many v
many v = some v <|> pure []
我得到了一些中的(:)被解除并应用于v的值,以便将它添加到'many v'中返回的列表中。但为什么许多人的定义从一些开始?为什么它与pure []连接?这两个功能之间的关系或区别是什么?这些方程式中最少解决方案对于某些人和许多人来说意味着什么?递归是如何停止的?救命啊!
答案 0 :(得分:4)
some p
表示一个或更多匹配p many p
表示零或更多匹配p 对于输入"abc"
,many letter
和some letter
都会解析abc
。
但是对于输入"123"
,many letter
将输出空字符串""
。 some letter
会报告错误。
根据定义。 some v
至少需要v
的一次匹配,因此我们可以先解析v
,然后我们需要v
的0个或多个匹配,即many v
。它类似于:
some v = do
first_match <- v
rest_matches <- many v
return $ first_match : rest_matches
与some v = (:) <$> v <*> many v
相同。
但many v
。它将匹配some v
(1或更多)或不匹配(纯[])。
many v = if matches (some v) then return (some v) else return nothing
。
您可以尝试从代码新闻中解决writing applicative parsers from scratch。
Functional pearls也是关于解析组合器的非常好的参考。