假设我的自定义联合使用以下代码:
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对象中所有数字的总和。
答案 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
。在此,x
是string * JSON
对,因此相当于fun (_, json) -> sumOfJson json
。