OCaml在线环境执行open List后List.sort compare报错如何解决
问题解答
核心结论
这不是compare被弃用导致的问题,根源是模块全局引入后的命名冲突
原因说明
OCaml标准库List模块自带同名的List.compare函数,作用是传入元素比较规则、对比两个列表的大小,函数签名如下:
val compare : ('a -> 'a -> int) -> 'a list -> 'a list -> int
当你执行open List全局引入List模块后,List.compare会覆盖默认全局作用域下的Stdlib.compare通用比较函数。你代码中传入List.sort的compare实际指向的是List.compare,和List.sort要求的元素比较函数类型不匹配,因此抛出类型错误。
解决方法
- 显式指定使用全局通用比较函数,调整写法为
List.sort Stdlib.compare [2;3;1];;,该写法不受是否引入List模块的影响 - 避免全局
open List,改用局部open调用List模块函数,例如List.(map f x),不会污染全局作用域命名 - 若仅需排序整数列表,可直接使用整数专用比较函数,写法为
List.sort Int.compare [2;3;1];;,语义更清晰,也不会触发命名冲突 - 可以在
open List之前提前为全局比较函数设置别名:let cmp = compare;; open List;;,后续排序调用List.sort cmp x即可
内容的提问来源于stack exchange,提问作者Theo Deep
相关产品推荐
相关产品推荐

