Для одного из моих курсов в прошлом семестре нам было поручено реализовать анализатор 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
Моя проблема с тем, как я справился с этим, заключается в том, что мне кажется, что я понял, как реализовать это на процедурном языке, и просто заменилцикл с функциями рекурсии и отбрасывания.Хотя это работает, мне интересно, что было бы более идиоматичным функциональным способом решения этой проблемы.