如何重新排序这些F#函数才有意义?

时间:2010-10-20 21:37:56

标签: f# functional-programming mutual-recursion

我认为我会和F#相处得很好,因为我在Haskell很体面,但我觉得我被一些简单的问题所困扰。我有一些简单的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 个答案:

答案 0 :(得分:11)

使用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
 ...

答案 1 :(得分:3)

尝试用let rec替换您的第二个and,以定义一组mutually recursive functions