【发布时间】:2019-04-20 07:42:26
【问题描述】:
给定一个解析器
newtype Parser a = Parser { parse :: String -> [(a,String)] }
(>>=) :: Parser a -> (a -> Parser b) -> Parser b
p >>= f = Parser $ \s -> concat [ parse (f a) s' | (a, s') <- parse p s ]
return :: a -> Parser a
return a = Parser (\s -> [(a,s)])
item :: Parser Char
item = Parser $ \s -> case cs of
"" -> []
(c:cs) -> [(c,cs)]
我们可以看到item 消耗了给它的部分输入字符串("abc" -> [('a', "bc")])。是否存在解析器会产生额外的字符串输出或替换/修改它的情况(例如Parser $ \s -> [((), 'a':s)])?我怀疑上下文相关的语法可能就是这种情况,但很难想出一个合理的例子。
对于现实世界的问题这样做有意义吗?
参考文献
【问题讨论】: