Domanda

ho pensato di andare d'accordo bene con F # da quando sono decente a Haskell, ma mi sento come se fossi perplesso da questioni semplici morti. Ho qualche codice di analisi per un parser JSON semplice, in questo modo:

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

che non funzionano, perché parseObject non sapere parseValue. non li può invertire uno o avrei avuto il problema opposto. Allora, cosa dovrei fare qui?

È stato utile?

Soluzione

Si definiscono reciprocamente funzione ricorsiva utilizzando la parola chiave and. In questo modo:

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

Altri suggerimenti

Provare a sostituire il secondo con let rec and per definire una serie di href="http://msdn.microsoft.com/en-us/library/dd233232.aspx" reciprocamente funzioni ricorsive .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top