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 rec2番目をで置き換えて、相互再帰関数andのセットを定義してみてください。

于 2010-10-20T21:52:09.050 に答える