我们正在尝试构建一个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)
答案 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)]
也就是说,它解析三个字符并产生一对由第一个和第三个字符组成的对。