Haskell中的字符串解析

Cod*_*ice 3 string parsing haskell

我是Haskell的新手,目前正在尝试解决需要进行字符串解析的问题.我的输入String包含以逗号分隔的引号中的单词列表.我想将这个单个字符串解析为字符串列表.我应该从哪里开始学习解析这样的String?是否有一个有用的partuclar模块和/或功能?

ps请不要发布完整的解决方案.我只是想要一个指向起始位置的指针,这样我就可以学习如何做到这一点.

Gab*_*lez 6

最强大的解决方案是解析器组合器.Haskell有几个,但最重要的是我想到的:

  • parsec:一个非常好的通用解析库
  • attoparsec:parsec的更快版本,它牺牲了错误消息的质量和一些其他功能以提高速度
  • uu-parsinglib:一个非常强大的解析库

解析器组合器的一大优点是,使用do符号(或Applicative样式,如果您愿意)定义解析器非常容易.

如果您只想要一些快速简单的字符串操作功能,那么请查阅text库(对于高性能字节编码的字符串),或Data.List(对于普通的列表编码字符串),它们提供了操作字符串所需的函数.


Cod*_*ice 6

最终,我决定滚动自己的解析函数,因为这种情况很简单。自从我首次发布此问题并想在此处记录我的解决方案以来,我已经学到了很多有关Haskell的知识:

split :: Char -> String -> [String]
split _ "" = []
split c s = firstWord : (split c rest)
    where firstWord = takeWhile (/=c) s
          rest = drop (length firstWord + 1) s

removeChar :: Char -> String -> String
removeChar _ [] = []
removeChar ch (c:cs)
    | c == ch   = removeChar ch cs
    | otherwise = c:(removeChar ch cs)

main = do
    handle <- openFile "input/names.txt" ReadMode
    contents <- hGetContents handle
    let names = sort (map (removeChar '"') (split ',' contents))
    print names
    hClose handle
Run Code Online (Sandbox Code Playgroud)


Ada*_*ner 5

由于Strings只是CharHaskell 中s的列表,因此Data.List将是一个开始查找的好地方(为了学习Haskell).

对于更复杂的情况(例如,逗号可以嵌套在引号内并且应该被忽略),parsec(如Daniel所提到的)将是更好的解决方案.

此外,如果您正在寻找解析CSV,您可以尝试Text.CSV,虽然我没有尝试过,所以我不能说它会有多大帮助.