对于我上一学期的一门课程,我们的任务是实现一个喷出格式化HTML的JSON解析器。我最终实现了它,我觉得它更像是一种迭代的方式而不是功能性的方式。这是我遇到的主要代码段:
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
关于我如何处理这个问题的问题在于,感觉好像我已经采用了如何用过程语言实现它,并且只是用递归和删除函数替换了循环。虽然这确实有用,但我想知道处理这个问题会有什么更为惯用的功能方式。