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
thatl[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
thatl[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所指的解决方案之外,您的代码还有很多问题。我建议从较小的规模开始逐步构建,以避免被错误淹没。谢谢你的建议,这是我最想要的。谢谢你的建议,这是我最想要的。