Compiler errors 编写一个函数'minimate_note t',返回'l'中不存在的最小自然整数`

Compiler errors 编写一个函数'minimate_note t',返回'l'中不存在的最小自然整数`,compiler-errors,ocaml,Compiler Errors,Ocaml,编写一个签名函数minimizer\u incidence:int\u list->int,例如调用smaller\u incidence l返回l中不存在的最小自然整数 let smallest_absent l = match l with |[] -> 0 |_ -> let m = ref (0,false) in while !m.(1) = false do if (mem l m.(0)) then !m.(1) := true ;

编写一个签名函数
minimizer\u incidence:int\u list->int
,例如调用
smaller\u incidence l
返回
l
中不存在的最小自然整数

let smallest_absent l =
match l with
|[] -> 0
|_ -> let m = ref (0,false) in
        while !m.(1) = false do
        if (mem l m.(0)) then !m.(1) := true ;
        else incr(m.(0));
        done;
    !m.(0);;
错误:

> while !m.(1) = false do
this expression is of type int * bool, but is used with the type 'a vect>`

我想知道我的代码有什么问题。如果它在概念上是正确的。谢谢。

类型错误说明了一切:您试图对
int
bool
的元组中的某个对象使用向量查找

您正在寻找的功能是


类似地,您不应该编写
m.(0)
,而应该编写
fst!m
使用

类型错误说明了一切:您试图对
int
bool
的元组进行向量查找

您正在寻找的功能是


类似地,您不应该编写
m.(0)
,而应该编写
fst!使用

你已经有了答案,所以它更像是评论或建议

从概念上讲,这可能是正确的,但它有一个可怕的复杂性,在ocaml程序中看到循环总是一件痛苦的事情(尤其是在这样简单的程序中)。我建议你从递归的角度考虑更多

使用排序列表(并且没有重复项)要简单得多,在这种情况下,您只需首先找到
i
that
l[i]!=我

let smallest_absent l =
  let l = List.sort_uniq compare l in
  let rec f i = function
    | [] -> i
    | h::t -> if h = i then f (i + 1) t
              else i in
  f 0 l

你可以想象进一步的优化。

你已经有了答案,所以更像是评论或建议

从概念上讲,这可能是正确的,但它有一个可怕的复杂性,在ocaml程序中看到循环总是一件痛苦的事情(尤其是在这样简单的程序中)。我建议你从递归的角度考虑更多

使用排序列表(并且没有重复项)要简单得多,在这种情况下,您只需首先找到
i
that
l[i]!=我

let smallest_absent l =
  let l = List.sort_uniq compare l in
  let rec f i = function
    | [] -> i
    | h::t -> if h = i then f (i + 1) t
              else i in
  f 0 l

您可以想象进一步的优化。

关于:寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。我认为现在可以了。除了这个错误和@gallais所指的解决方案之外,您的代码还有很多问题。我建议从更小的开始,逐步构建,以避免被错误淹没。首先:寻求调试帮助的问题(“为什么这个代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。我认为现在可以了。除了这个错误和@gallais所指的解决方案之外,您的代码还有很多问题。我建议从较小的规模开始逐步构建,以避免被错误淹没。谢谢你的建议,这是我最想要的。谢谢你的建议,这是我最想要的。