我以为我在哈斯克尔(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。也无法扭转它们,否则我会遇到相反的问题。那我应该在这里做什么?

有帮助吗?

解决方案

您使用 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
 ...

其他提示

尝试更换第二个 let recand 定义一组 相互递归的功能.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top