4

因为我在 Haskell 上表现不错,所以我认为我可以与 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。也不能扭转它们,否则我会遇到相反的问题。那么我应该在这里做什么?

4

2 回答 2

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
 ...
于 2010-10-20T21:52:42.807 回答
3

尝试将您的第二个替换let recand定义一组相互递归的函数

于 2010-10-20T21:52:09.050 回答