Как я могу изменить порядок этих функций F #, чтобы иметь смысл? - PullRequest
4 голосов
/ 21 октября 2010

Я думал, что буду хорошо ладить с 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. Я тоже не могу их поменять или я получу противоположную проблему. Так что мне здесь делать?

Ответы [ 2 ]

11 голосов
/ 21 октября 2010

Вы определяете взаимно рекурсивную функцию, используя ключевое слово 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
 ...
3 голосов
/ 21 октября 2010

Попробуйте заменить ваш второй let rec на and, чтобы определить набор взаимно рекурсивных функций .

...