【问题标题】:F# JSON connected taskF# JSON 连接任务
【发布时间】:2017-10-09 20:49:37
【问题描述】:

假设我的自定义联合有以下代码:

type JSON =
| Object of (string * JSON) list
| Array of JSON list
| Number of double
| Boolean of bool
| Null
| String of string

如何实现“查找 JSON 对象中所有数字的总和”功能? let summarizer (tree : JSON) : int

它应该递归遍历 JSON 树并返回 JSON 对象中所有数字的总和。

【问题讨论】:

  • 在我回答这个问题之前:这是你需要自己做的功课吗?换句话说,您是在寻找可以自己得出答案的提示,还是在寻找更完整的答案?
  • @rmunn 任何东西。当然,完整的答案会很棒。
  • 请注意,如果这个家庭作业,你应该注意你从 StackOverflow 获得了帮助,并参考这个问题。如果您承认,大多数教授都完全可以接受您的帮助,但是在假装是您自己的情况下提交别人的代码将是作弊,并且会产生严重的后果。如果这不是家庭作业,而您只是想自己学习 F# 技术,请忽略此评论。 :-)

标签: .net json f# functional-programming


【解决方案1】:

您应该首先考虑JSON 类型的每个案例,并确定该案例对总和的贡献。我会从下到上,因为最上面的案例是最难的:

  • String - 总和会加 0.0。
  • Null - 总和会加 0.0。
  • Boolean - 总和会增加 0.0。
  • Number - 将自己添加到总和中。
  • Array - 遍历数组中的各个 JSON 项目,并计算它们各自的总和。所有这些加在一起的总和都会添加到运行总和中。
  • Object - 遍历这些对,在每一对中,第二个项目是一个 JSON 对象,它有一个总和。把所有这些加起来,你就会得到一个数字来添加到总和中。

现在我们几乎已经为我们编写了函数!

let rec sumOfJson = function
    | Object list -> List.sumBy (snd >> sumOfJson) list
    | Array list -> List.sumBy sumOfJson list
    | Number n -> n
    | Boolean _
    | Null
    | String _ -> 0.0

如果您不理解snd >> sumOfJson 部分,那完全等同于fun x -> x |> snd |> sumOfJson。这里,x 是一个 string * JSON 对,所以它等价于 fun (_, json) -> sumOfJson json

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多