似乎我无法为ref分配一个抽象值,我不知道该怎么做.
open Big_int
let largest = ref zero_big_int;;
let depth = ref zero_big_int;;
let rec big i = (add_int_big_int i zero_big_int)
and collatz = fun num depth ->
print_endline (string_of_big_int num);
(if(eq_big_int (add_int_big_int (-1) num) zero_big_int)then(depth)else(
if eq_big_int (mod_big_int num (big 2)) zero_big_int then (collatz (div_big_int num (big 2)) (succ_big_int depth)) else (collatz (succ_big_int (mult_int_big_int 3 num)) (succ_big_int depth))))
and euler14 i =
print_endline (string_of_big_int i);
(if(lt_big_int i (big 1000000))then (
let ret = (collatz i unit_big_int) in
if(ret> !depth)then (largest:=i;depth:=ret; (euler14 (succ_big_int i))) else (euler14 (succ_big_int i))
) else (!largest));;
print_endline (string_of_big_int (euler14 (big 2)));;
Run Code Online (Sandbox Code Playgroud)
当我尝试最大值时代码似乎崩溃:= i和depth:= ret这两个都是Big_nums.有没有办法解决?
2
2
1
3
3
10
5
16
8
4
2
1
Fatal error: exception Invalid_argument("equal: abstract value")
Run Code Online (Sandbox Code Playgroud)
你不能比较类型的值Big_int.big_int
与多态=
,>
,>=
.相反,您必须为包含a的所有类型编写自己的比较函数Big_int.big_int
,即使它是深度嵌入的.
使用OCaml 3.12.1或更高版本,您可以将多态比较函数与Z.t
在外部库Zarith中实现的类型值一起使用,Zarith是Big_int的现代替代品.
与多态操作兼容只是Zarith优于Big_int的优势之一.它在内存中也更紧凑,速度更快.