上学期我的一门类(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 。它为您提供了解析器组合器的一个简单示例。然后我会查看可用的解析器组合器,例如 parsec
、attoparsec
和 trifecta
。我个人喜欢 attoparsec
,但 trifecta
有更多功能。
我还编写了一个关于 attoparsec
的小教程。它并不完整,但应该可以帮助您入门。
关于json - Haskell JSON 解析器的改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50219127/