2017-08-14 34 views
2

功能我一直在寻找写在Haskell词法分析器的意思,我偶然发现了这些功能。什么是定义为“一些”与“多”的哈斯克尔替代

如果定义,一些和许多应该是 方程的解最小:

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

many v = some v <|> pure []

我得到了(:)在一些被取消,应用于v的值,以便将其前置到以'many v'返回的列表中。但为什么许多人的定义从一些开始?为什么它会与纯粹的[]结合在一起?这两个功能之间的关系或区别是什么?对于一些和许多人来说,这些方程式的最小解决方案意味着什么?递归如何停止?帮帮我!

+7

它没有得到* *串联用'纯[]'。空列表是递归停止的*替代*。 – Bergi

+7

“一些”意味着“至少一个”,而“多”意味着“无一个或多个”。 – Bergi

+0

啊哈谢谢。我认为这开始有意义。所以有些保证至少有一个值,接着是0或更多,并且许多会给你至少一个值(加上0或更多)*或*什么也没有。但递归到底如何呢? v的值如何消耗? – northlane

回答

4
  • some p装置P的一个或多个匹配
  • many p装置或更多更多匹配p

对于输入​​,many lettersome letter都将解析abc的。

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

根据定义。 some v需要的v至少1场,所以我们可以先解析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
+0

这对我很有用,谢谢! – northlane