¿Cómo puedo cambiar el orden de estas funciones F # que tener sentido?
-
09-10-2019 - |
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í?
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 .