Haskell备选方案中"some"函数和"many"函数的定义是什么意思



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

如果定义,somemany应该是 方程:

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

many v = some v <|> pure []

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

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

这两个功能之间的关系或区别是什么?somemany是这些方程的最小解意味着什么?递归是如何停止的?帮助!

  • >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

这与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

最新更新