OCaml 在线:List.sort 比较无效

OCaml online: List.sort compare is not working

我正在测试以下OCaml的在线环境:https://try.ocamlpro.com/

但是,由于使用 List.sort compare x,我的算法失败了,其中 x 是一个整数列表。我测试了以下基本代码 List.sort compare [2; 3; 1];; 并发现它抛出错误:

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 

网上环境指定的是OCaml 4.13.1,那是不是意味着compare被弃用了?那样的话,我该如何替代呢?


编辑:

我看过以下内容:

如果你只是在在线环境下写List.sort compare [2; 3; 1];;,那么它returns正确的输出- : int list = [1; 2; 3]

但是,如果您使用 open List 加载 List module,则会抛出上述错误。

如评论中所述,通过打开列表模块,您现在已经用 List.compare 隐藏了 Stdlib.compare(或 Pervasives.compare),并且以下不再有效。

sort compare [2; 3; 1]

对此有一些解决方案。

不要打开List

不用打开List,就可以成功引用StdlibPervasives.

中的多态compare
List.sort compare [2; 3; 1]

如果需要,我们可以给 List 一个更短的名字。

module L = List

然后写:

L.sort compare [2; 3; 1]

打开List并明确引用Stdlib.compare

当我们打开 List 时,它的 compare 隐藏了多态 compare,但那个功能仍然存在。

sort Stdlib.compare [2; 3; 1]

这很奇怪。 List.sort compare [2; 3; 1].

你可能会过得更好

当然,在这种情况下你并不真的需要多态 compare。你只需要比较整数。

sort Int.compare [2; 3; 1]

还不错。

重命名compare

您可以将 Stdlib.compare 绑定到其他名称。打开 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]