所以,如果我有一个字符串"(这,是,a,故事,全部,关于,如何)"进入其中的单词列表["这","是"," a","故事","所有& #34;,"关于","如何"]作为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
答案 0 :(得分:2)
解析器a +++ b
将整个输入字符串发送到a
,将整个输入字符串发送到b
,生成解析器生成的所有结果。您需要一个解析器将字符串的第一部分发送到a
,将第二部分发送到b
,然后让您合并结果。试试这个:
parseLet = liftA2 (\ss s -> ss ++ [s]) (many parseStr) parseLast
对于这个确切的用例,许多解析器库还提供了一个manySepBy
组合子(可能名称略有不同);你可以考虑通过ReadP
库查看这样的事情。