所以如果我有一个字符串“(this,is,a,story,all,about,how)”到其中的单词列表中[“this”,“is”,“a”,“story”,“all ", "about", "how"] 作为 ReadP String 的实例?我尝试了很多不同的方法,其中之一是:
parseStr :: ReadP String
parseStr = do
skipSpaces
n <- munch1 isAlphaOrDigit
skipComma
return $ n
它解析除最后一个值之外的所有值。我想如果我将它与这个解析结合起来:
parseLast :: ReadP String
parseLast = do
skipSpaces
n <- munch1 isAlphaOrDigit
return $ n
as
parseLet = (many parseStr) +++ parseLast
但这也不起作用。有小费吗?
编辑:更多定义
isAlphaOrDigit :: Char -> Bool
isAlphaOrDigit a = (isDigit a) || (isAlpha a)
comma = satisfy (','==)
skipComma = const () <$> some comma
解析器a +++ b
将整个输入字符串发送到a
以及整个输入字符串b
,产生任一解析器产生的所有结果。相反,您需要一个解析器将字符串的第一部分发送到a
第二部分b
,然后让您合并结果。试试这个:
parseLet = liftA2 (\ss s -> ss ++ [s]) (many parseStr) parseLast
许多解析器库还提供manySepBy
针对这个具体用例的组合器(可能名称略有不同);你可能会考虑浏览ReadP
图书馆有这样的事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)