nor*_*ane 2 haskell functional-programming some-and-many
我一直想用 Haskell 编写一个词法分析器,并偶然发现了这些函数。
如果定义的话,
some和many应该是方程的最小解:
some v = (:) <$> v <*> many v
many v = some v <|> pure []
我知道(:)insome被提升并应用于 的值,v以便将其添加到 in 返回的列表中many v。
但为什么 的定义以many开头some呢?为什么它会与 连在一起pure []?
这两个函数有什么关系或区别?这些方程的最小解意味着some什么?递归如何停止?帮助!many
some p表示p 的一个或多个匹配many p表示p 的零个或多个匹配对于输入"abc",many letter和some letter都会解析abc。
但对于输入"123",many letter会输出空字符串""。some letter会报错。
根据定义。some v需要至少 1 个匹配v,因此我们可以先解析v,然后我们需要 0 个或多个匹配v,即many v。它是这样的:
some v = do
first_match <- v
rest_matches <- many v
return $ first_match : rest_matches
Run Code Online (Sandbox Code Playgroud)
这与 相同some v = (:) <$> v <*> many v。
但对于many v。它要么匹配some v(1 个或多个),要么什么也不匹配(纯 [])。
many v = if matches (some v) then return (some v) else return nothing。
您可以尝试从代码战争中从头开始编写应用解析器。
函数式珍珠也是关于解析组合器的非常好的参考。
| 归档时间: |
|
| 查看次数: |
419 次 |
| 最近记录: |