How can I reorder these F# functions to make sense?
-
09-10-2019 - |
Pergunta
I thought I'd be getting along alright with F# since I'm decent at Haskell, but I feel like I'm being stumped by dead simple issues. I have some parsing code for a simple JSON parser, like this:
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
...
That won't work, because parseObject doesn't know about parseValue. Can't reverse them either or I'd get the opposite problem. So what am I supposed to do here?
Solução
You define mutually recursive function using the and
keyword. Like this:
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
...
Outras dicas
Try replacing your second let rec
with and
to define a set of mutually recursive functions.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow