Haskell Parser中的排序运算符

时间:2017-11-07 11:00:51

标签: parsing haskell functional-programming

我们正在尝试构建一个Parser,但即使我理解了>>>=运算符,我也无法理解函数p的工作方式。 de p函数如何工作?

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

returnb :: a -> Parser a
returnb v = \input -> [(v, input)]

failure :: Parser a
failure = \input -> []

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


parse :: Parser a -> String -> [(a, String)]
parse parser input = parser input
-- Sequencing operator

(>>>=) :: Parser a -> (a -> Parser b) -> Parser b
p >>>= f = \input -> case parse p input of
    [] -> []
    [(v, out)] -> parse (f v) out
p :: Parser (Char, Char)
p = item >>>= \x -> 
    item >>>= \z -> 
    item >>>= \y -> 
    returnb (x,y)

2 个答案:

答案 0 :(得分:1)

据我所知,它读取了三个char并将第一个和最后一个作为一对包裹在Parser monad中。

答案 1 :(得分:0)

如果p特别是问题,它的工作方式类似于这个伪程序,它完全弥补了,但希望能说明这个流程:

p input = let [(x, rest1)] = item input
              [(z, rest2)] = item rest1
              [(y, rest3)] = item rest2
          in
             [((x, y), rest3)]

也就是说,它解析三个字符并产生一对由第一个和第三个字符组成的对。