Tree n元树OCaml的深度

Tree n元树OCaml的深度,tree,functional-programming,ocaml,depth,Tree,Functional Programming,Ocaml,Depth,我必须在OCaml中只使用函数范式计算n元树的深度,而不使用外部函数。这是结构图: type nTree = Id of int | Leaf of string | Tree of string * string * nTree list 下面是我的结果: let rec height t = match t with | Id _ -> 0 | Leaf _ -> 0 | Tree(_,_,n) -> if n = [] t

我必须在OCaml中只使用函数范式计算n元树的深度,而不使用外部函数。这是结构图:

type nTree = 
  Id of int
  | Leaf of string
  | Tree of string * string * nTree list
下面是我的结果:

  let rec height t = match t with
     | Id _ -> 0
     | Leaf _ -> 0
     | Tree(_,_,n) -> if n = [] then 1
                      else let e::r = n in max 
                      (List.fold_left (fun acc x -> acc + height x) 1 [e])
                      (List.fold_left (fun acc x -> acc + height x) 1 r)
它可以工作,但我发现它非常难看,
e::r
位由于与
[]
模式不匹配而导致警告。 有没有办法让这个警告变得免费和“漂亮”

谢谢

由于与
[]
模式不匹配,
e::r
位导致警告

如果,您只需使用模式匹配而不是

match n with
  | [] -> 1
  | e::r -> …
但实际上,根本没有必要区分这些。你应该做什么

  let rec height = function
     | Id _ -> 0
     | Leaf _ -> 0
     | Tree(_,_,n) -> 1 + List.fold_left max 0 (List.map height n)
由于与
[]
模式不匹配,
e::r
位导致警告

如果
,您只需使用模式匹配而不是

match n with
  | [] -> 1
  | e::r -> …
但实际上,根本没有必要区分这些。你应该做什么

  let rec height = function
     | Id _ -> 0
     | Leaf _ -> 0
     | Tree(_,_,n) -> 1 + List.fold_left max 0 (List.map height n)

你为什么要把所有小树的高度加起来?因为我需要它们?例如树(“a”、“b”),[树(“c”、“d”),[树(“e”、“f”),[叶(“f”)];叶(“g”)];Id(2);树(“h”、“i”和[])],应该返回3,因为第一棵树中的最大级别为2。可能我的问题没有正确表述,或者我没有理解。不,我是问你为什么要对它们求和。当然你需要它们全部,但是你如何获得当前节点的深度?是的,我想在递归beca中有一些我不理解的地方使用你的答案是正确的。我只是假设我需要它们,否则所有的树都会计入树的高度。我的第一次尝试是这样的:| Tree(,,n)->List.fold_left(fun x y->x+height y)这是对所有树的求和。你为什么要对所有子树的高度求和?因为我需要它们?例如树(“a”,“b”,“树(“c”,“d”,“树(“e”,“f”),[叶(“f”)];叶(“g”);Id(2);树(“h”,“I”,“[])],应该返回3,因为第一棵树中的最大级别为2。可能我的问题没有正确表述,或者我没有理解。不,我是问你为什么要对它们求和。当然你需要它们全部,但是你如何获得当前节点的深度?是的,我想在递归beca中有一些我不理解的地方使用你的答案是正确的。我只是假设a我需要它们,否则所有的树都会计算在树的高度上。我的第一次尝试是这样的:| Tree(,,n)->List.fold_left(fun x y->x+height y)1 n。它将所有树相加。