json - Haskell JSON 解析器的改进

标签 json parsing haskell functional-programming

上学期我的一门类(class)的任务是实现一个 JSON 解析器,它可以输出格式化的 HTML。我最终以我认为更像是一种迭代方式而不是功能性方式来实现它。这是我遇到问题的主要代码片段:

stringToTokens (x:xs)
            .....
            | x == '\"' = StringLiteral (parseStringToken xs) : stringToTokens (advancePastString xs)
            | startsNumeric x = Numeric (processNumeric (x:xs) takeWhile) : stringToTokens (processNumeric xs dropWhile)
            | startsKeyword x = Keyword (processKeyword (x:xs) take) : stringToTokens (processKeyword (x:xs) drop)
            .....
            | otherwise = stringToTokens xs

....
advancePastString :: String -> String
advancePastString (x:xs)
            | x == '\"' = xs
            | x == '\\' = advancePastString (tail xs)
            | otherwise = advancePastString xs

我对如何处理这个问题的问题是,感觉好像我已经采取了如何用过程语言实现它,只是用递归和删除函数替换了循环。虽然这确实有效,但我想知道处理此问题的更惯用的功能方式是什么。

最佳答案

我会尝试解析器组合器。这是一个很好的起点:Write You a Haskell: Parsing by Stephen Diehl 。它为您提供了解析器组合器的一个简单示例。然后我会查看可用的解析器组合器,例如 parsecattoparsectrifecta。我个人喜欢 attoparsec,但 trifecta 有更多功能。

我还编写了一个关于 attoparsec 的小教程。它并不完整,但应该可以帮助您入门。

关于json - Haskell JSON 解析器的改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50219127/

相关文章:

c# - 解析 JSON 对象数组

sql - 带有要记录的数组的 Json 列

python - 如何使用 lxml 在 Python 中获取已解析 HTML 页面的当前 url?

Android解析xml和AsyncTask doInBackground方法永远不会完成

Haskell IO 俄语符号

维基书中的 Haskell 状态示例 : fix per current Haskell?

haskell - 计算期间在环境中隐式携带 STRef

Eclipse的JSON格式化程序

java - Spring boot,如何从json文件读取特定对象,我需要什么注释?

parsing - 启动服务器时出现 %PARSER_ERROR