I am testing the following OCaml's online environment: https://try.ocamlpro.com/
However, my algorithms are failing because of the use of List.sort compare x
, where x
is a list of integers. I have tested the following basic code List.sort compare [2; 3; 1];;
and seen it throws an error:
Error: This expression has type ('a -> 'a -> int) -> 'a list -> 'a list -> int
but an expression was expected of type
('a -> 'a -> int) -> ('a -> 'a -> int) -> int
Type 'a list is not compatible with type 'a -> 'a -> int
The online environment specifies it is OCaml 4.13.1, so does this mean compare
is deprecated? In that case, how can I substitute it?
EDIT:
I have seen the following:
If you just write List.sort compare [2; 3; 1];;
in the online environment, then it returns the correct output - : int list = [1; 2; 3]
.
However, if you load the List module
with open List
, then the error above is thrown.
CodePudding user response:
As noted in the comments, by opening the List module, you've now shadowed Stdlib.compare
(or Pervasives.compare
) with List.compare
, and the following no longer works.
sort compare [2; 3; 1]
There are a few solutions to this.
Don't open List
Without opening List
, you can successfully refer to the polymorphic compare
from Stdlib
or Pervasives
.
List.sort compare [2; 3; 1]
We can give List
a shorter name if it's preferable.
module L = List
Then write:
L.sort compare [2; 3; 1]
Open List
and explicitly refer to Stdlib.compare
When we open List
, its compare
shadows the polymorphic compare
, but that function is still there.
sort Stdlib.compare [2; 3; 1]
That's pretty unweildly. You're probably just better off with List.sort compare [2; 3; 1]
.
Of course, in this case you don't really need the polymorphic compare
. You just need to compare integers.
sort Int.compare [2; 3; 1]
That's not so bad.
Rename compare
You could bind Stdlib.compare
to a different name. Either before or after opening List
.
let cmp = compare
open List
let l = sort cmp [2; 3; 1]
open List
let cmp = Stdlib.compare
let l = sort cmp [2; 3; 1]