Как я могу изменить эти функции F#, чтобы иметь смысл?

StackOverflow https://stackoverflow.com/questions/3982531

Вопрос

Я думал, что буду хорошо ладить с 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 Чтобы определить набор взаимно рекурсивные функции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top