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

Cod*_*num 4 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
 ...
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为parseObject不知道parseValue.不能扭转他们或我会遇到相反的问题.那我该怎么办呢?

sep*_*p2k 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
 ...
Run Code Online (Sandbox Code Playgroud)