F#JSON连接任务

时间:2017-05-11 02:20:41

标签: .net json f# functional-programming

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

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对象中所有数字的总和。

1 个答案:

答案 0 :(得分:4)

您应首先考虑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。在此,xstring * JSON对,因此相当于fun (_, json) -> sumOfJson json