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

What is the meaning of the definitions for the "some" and "many" functions in the Haskell Alternative

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

If defined, some and many should be the least solutions of the equations:

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.

您可以尝试从 codewars 中解决 writing applicative parsers from scratch

Functional pearls 也是一个关于解析组合器的很好的参考。


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