parsing - 解析器的问题

标签 parsing haskell

我希望有人能帮助我理解以下代码

type Parser a = String -> [(a,String)]

item :: Parser Char
item = \ s -> case s of
    [] -> []
    (x:xs) -> [(x,xs)]

returnP :: Parser a
returnP a  = \s -> [(a,s)] 


(>>=) :: Parser a -> (a -> Parser b) -> Parser b
p>>=f = \s -> case p s of
    [(x,xs)]-> f x xs
    _ -> []


twochars :: Parser (Char,Char)
twochars= item >>= \a -> item >>= \b -> returnP (a,b)

一切似乎都很清楚,但我不明白twochars函数最后一行的lampda函数。如果有人能给我一个解释,那就太好了。

最佳答案

为了清晰起见,重写了 twochars 函数,它基本上是:

twochars = 
  item >>= \a -> -- parse a character and call it `a`
  item >>= \b -> -- parse another character and call it `b`
  returnP (a,b)  -- return the tuple of `a` and `b`

这里的 lambda 表达式只是为解析后的字符引入名称,并让它们传递到后面的计算部分。

它们对应于您定义的绑定(bind)中的第二个参数:

(>>=) :: Parser a        -- your item
      -> (a -> Parser b) -- your lambda returning another parse result
      -> Parser b        

关于parsing - 解析器的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11674037/

相关文章:

excel - 根据左列单元格组合相邻行单元格

haskell - 到底是什么 "-<",无论如何?

haskell - Monad.Reader 和 (->) monad 有什么区别?

haskell - 如何在 Haskell 中实现最佳优先搜索?

haskell - 计算 Haskell 中的变化

java - 如何使用正则表达式从字符串中解析数字

javascript - JSON.parse( ) 的数值变化

html - 在 Dart 中将 HTML 字符串解析为 DOM

python - 使用 Pyparsing 生成 Sql 到 Pymongo

haskell - 如何避免重新计算具有相同参数的纯函数?