Pregunta

Yo pensé que estaría recibiendo a lo largo de bien con F # ya que soy decente en Haskell, pero me siento como que estoy siendo confundido por los conceptos más simples muertos. Tengo algo de código de análisis para un analizador JSON sencilla, como esto:

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

Eso no funcionará, porque parseObject no saber sobre parseValue. No se puede revertir ellos, ya sea o que tendría el problema opuesto. Entonces, ¿qué se supone que tengo que hacer aquí?

¿Fue útil?

Solución

Se definen mutuamente función recursiva utilizando la palabra clave and. De esta manera:

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

Otros consejos

Probar la sustitución de su segundo let rec con and para definir un conjunto de href="http://msdn.microsoft.com/en-us/library/dd233232.aspx" mutuamente funciones recursivas .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top