【问题标题】:How can I reorder these F# functions to make sense?如何重新排序这些 F# 函数以使其有意义?
【发布时间】:2011-04-28 07:21:56
【问题描述】:

我认为我可以与 F# 相处得很好,因为我在 Haskell 方面表现不错,但我觉得我被一些简单的问题难住了。我有一些简单 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。也不能扭转它们,否则我会遇到相反的问题。那么我应该在这里做什么呢?

【问题讨论】:

    标签: f# functional-programming mutual-recursion


    【解决方案1】:

    尝试用and 替换您的第二个let rec 以定义一组mutually recursive functions

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 啊!我什至不知道您必须指出“相互递归函数”。哈斯克尔宠坏了我。非常感谢,否则我会永远理解这是问题所在。
      猜你喜欢
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      相关资源
      最近更新 更多