Haskell Alternative中“some”和“many”函数定义的含义是什么?

时间:2017-08-14 00:28:10

标签: haskell functional-programming

我一直在寻找在haskell写一个词法分析器,我偶然发现了这些功能。

  

如果定义,一些和许多应该是最少的解决方案   等式:

     

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

     

many v = some v <|> pure []

我得到了一些中的(:)被解除并应用于v的值,以便将它添加到'many v'中返回的列表中。但为什么许多人的定义从一些开始?为什么它与pure []连接?这两个功能之间的关系或区别是什么?这些方程式中最少解决方案对于某些人和许多人来说意味着什么?递归是如何停止的?救命啊!

1 个答案:

答案 0 :(得分:4)

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

对于输入"abc"many lettersome letter都会解析abc

但是对于输入"123"many letter将输出空字符串""some letter会报告错误。

根据定义。 some v至少需要v的一次匹配,因此我们可以先解析v,然后我们需要v的0个或多个匹配,即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

您可以尝试从代码新闻中解决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