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
,就可以成功引用Stdlib
或Pervasives
.
中的多态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]
我正在测试以下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
,就可以成功引用Stdlib
或Pervasives
.
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]