2

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

如果定义,some并且many应该是方程的最小解:

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

many v = some v <|> pure []

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

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

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

4

1 回答 1

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

这与 相同some v = (:) <$> v <*> many v

但是对于many v. 它将匹配some v(1 个或更多)或不匹配(纯 [])。

many v = if matches (some v) then return (some v) else return nothing.

您可以尝试从 codewars从头开始​​编写应用程序解析器。

功能珍珠也是关于解析组合器的一个很好的参考。


  1. https://www.codewars.com/kata/writing-applicative-parsers-from-scratch
  2. http://www.cs.nott.ac.uk/~pszgmh/pearl.pdf
于 2017-08-14T02:48:47.643 回答