如何将一串逗号分隔值解析为haskell中的字符串列表?

时间:2016-11-20 23:19:23

标签: haskell

所以,如果我有一个字符串"(这,是,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

1 个答案:

答案 0 :(得分:2)

解析器a +++ b将整个输入字符串发送到a,将整个输入字符串发送到b,生成解析器生成的所有结果。您需要一个解析器将字符串的第一部分发送到a,将第二部分发送到b,然后让您合并结果。试试这个:

parseLet = liftA2 (\ss s -> ss ++ [s]) (many parseStr) parseLast

对于这个确切的用例,许多解析器库还提供了一个manySepBy组合子(可能名称略有不同);你可以考虑通过ReadP库查看这样的事情。