Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ocaml 如何更改树的类型以返回几乎任何类型树的正确值?_Ocaml - Fatal编程技术网

Ocaml 如何更改树的类型以返回几乎任何类型树的正确值?

Ocaml 如何更改树的类型以返回几乎任何类型树的正确值?,ocaml,Ocaml,我试图找到节点树的最大值,我有这样的错误 此表达式的类型为int bintree,但表达式的类型应为“a bintree bintree”。 类型int与类型“a bintree”不兼容 输入'a bintree'= |零 |“二叉树”的T;二叉树的a*;; 设t=t-Nil,1,Nil,2,t-Nil,3,Nil,4,t-Nil,6,Nil,5,Nil;; 设rec最大值t= 匹配 |零->零 |T零,v,零->v |TL,v,r->最大l最大r;; 您的问题是确定空树的最大值。最大值应为“a

我试图找到节点树的最大值,我有这样的错误 此表达式的类型为int bintree,但表达式的类型应为“a bintree bintree”。 类型int与类型“a bintree”不兼容

输入'a bintree'= |零 |“二叉树”的T;二叉树的a*;; 设t=t-Nil,1,Nil,2,t-Nil,3,Nil,4,t-Nil,6,Nil,5,Nil;; 设rec最大值t= 匹配 |零->零 |T零,v,零->v |TL,v,r->最大l最大r;;
您的问题是确定空树的最大值。最大值应为“a”类型,但您返回的是“Nil”,它是“a bintree”类型

这实际上是一个有趣的问题。您需要一个适用于任何类型的值。但实际上没有这样的价值

一种可能是有一个额外的参数,指定树为空时要使用的值。它将表示负无穷大,这是树中任何类型的最小可能值


正如@ThéoWinterhalter所建议的,另一个可能更好的解决方案是让函数返回类型“a”选项。当树为空时,它将返回None,否则返回maxval。

这是扫描项目集合以查找某种最佳元素(例如最大值或最小值)时的常见问题。问题是容器可能是空的,在这种情况下,无法提取最佳元素。OCaml提供了用于表示值或不表示值的选项类型,因此最好在这里使用它。这就是我的解决方案的样子:

let maximum t =
  let rec loop best t =
    match t with
    | Nil -> best
    | T (l, v, r) ->
      let best = max best v in
      let best = max best (loop best l) in
      loop best r
  in
  match t with
  | Nil -> None
  | T (_, init, _) -> Some (loop init t)
如果树为空(即,如果为零),则返回None。否则,它返回一些v,其中v是集合的最佳元素,即max函数确定的最大值


这种技术依赖于首先从容器中提取一个元素。这是我们最初的候选人。然后我们继续扫描容器,寻找更好的候选者,最后返回我们找到的最佳候选者。同样的技术也适用于列表、数组和其他容器。它也可以参数化,以二选一的函数作为参数,例如min,如果我们想获得最小值而不是最大值。

正确的方法不是使用option吗?最大零=无。是的,我正要把这个添加到我的答案中。谢谢你的最后一个分支也需要考虑V吗?如果你有一个有价值的右分支,你能忽略左分支吗?对不起,我想的是排序树。这是在各种容器上定义最大或最小函数时的常见问题。除了前面提到的方法之外,另一种方法是确保容器至少有一个元素。1.从树中提取一个值或调用无效的参数空树2。使用该值作为初始最佳候选值,这样就不必处理选项类型。