Invalid argument to OCaml ("equal: abstract value")

It seems that I cannot assign an abstract value to ref, and I'm not sure what to do.

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)));; 

The code seems to crash when I try the greatest: = me and depth: = ret, which are Big_nums. Is there any way around this?

 2 2 1 3 3 10 5 16 8 4 2 1 Fatal error: exception Invalid_argument("equal: abstract value") 
+4
source share
2 answers

You cannot compare values โ€‹โ€‹of type Big_int.big_int with polymorphic = , > , >= . Instead, you need to write your own comparison functions for all types that contain Big_int.big_int , even if it is deeply embedded.

Using OCaml 3.12.1 or later, you can use the functions of polymorphic comparison with values โ€‹โ€‹of the Zt type implemented in the Zarith external library, a modern replacement for Big_int.

Compatibility with polymorphic operations is just one of the advantages of Zarith over Big_int. It is also more compact in memory and faster.

+5
source

What is unsuccessful seems to be a polymorphic comparison of ret > !depth , rather than a link assignment. I would suggest that you can use Big_int.compare_big_int .

 # let x = big_int_of_int 3;; val x : Big_int.big_int = <abstr> # let y = big_int_of_int 4;; val y : Big_int.big_int = <abstr> # x > y;; Exception: Invalid_argument "equal: abstract value". # compare_big_int xy;; - : int = -1 # 

(Polymorphic comparison is one of the sharpest spots in OCaml.)

0
source

All Articles