Как я могу изменить эти функции F#, чтобы иметь смысл?
-
09-10-2019 - |
Вопрос
Я думал, что буду хорошо ладить с F#, так как я порядочный в Хаскелле, но я чувствую, что меня оторван от мертвых простых проблем. У меня есть код анализа для простого анализатора JSON, например:
let rec parseObject tokens = function
| '"' :: cs -> parseString tokens cs
| ':' :: cs -> parseValue tokens cs
| '}' :: cs -> tokens, cs
...
let rec parseValue tokens = function
| c :: cs when Char.IsWhiteSpace(c) -> parseValue tokens cs
| '{' :: cs -> parseObject tokens cs
...
Это не сработает, потому что ParseObject не знает о Parsevalue. Не могу их обратить вспять или я получу противоположную проблему. Так что я должен здесь делать?
Решение
Вы определяете взаимно рекурсивную функцию, используя and
ключевое слово. Как это:
let rec parseObject tokens = function
| '"' :: cs -> parseString tokens cs
| ':' :: cs -> parseValue tokens cs
| '}' :: cs -> tokens, cs
...
and parseValue tokens = function
| c :: cs when Char.IsWhiteSpace(c) -> parseValue tokens cs
| '{' :: cs -> parseObject tokens cs
...
Другие советы
Попробуйте заменить второй let rec
с and
Чтобы определить набор взаимно рекурсивные функции.
Не связан с StackOverflow