Haskell Alternative 中“一些”和“许多”函数的定义是什么意思

nor*_*ane 2 haskell functional-programming some-and-many

我一直想用 Haskell 编写一个词法分析器,并偶然发现了这些函数。

如果定义的话,somemany应该是方程的最小解:

some v = (:) <$> v <*> many v

many v = some v <|> pure []

我知道(:)insome被提升并应用于 的值,v以便将其添加到 in 返回的列表中many v

但为什么 的定义以many开头some呢?为什么它会与 连在一起pure []

这两个函数有什么关系或区别?这些方程的最小解意味着some什么?递归如何停止?帮助!many

del*_*lta 5

  • some p表示p 的一个或多个匹配
  • many p表示p 的零个或多个匹配

对于输入"abc"many lettersome 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

您可以尝试从代码战争中从头开始编写应用解析器

函数式珍珠也是关于解析组合器的非常好的参考。


  1. https://www.codewars.com/kata/writing-applicative-parsers-from-scratch
  2. http://www.cs.nott.ac.uk/~pszgmh/pearl.pdf