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。不能扭转他们或我会遇到相反的问题。那我该怎么办呢?
答案 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。