比较非 int 类型的相等运算符

er0*_*er0 0 ocaml

我最近将我的项目从 OCaml 4.03 更新到 OCaml 4.13。一项更改是,在检查非 int 类型之间的相等性时出现类型错误。例如,floats我得到这个:

错误:此表达式的类型为 float,但表达式应为 int 类型

我可以通过明确使用 来解决这个问题Float.(f0 = f1)。但我在自定义类型上遇到了同样的问题。例如:

utop # type e = X | Y
utop # let a = X;;
val a : e = X
utop # let b = Y;;
utop # X = Y;;
Error: This expression has type e but an expression was expected of type int
Run Code Online (Sandbox Code Playgroud)

处理这种情况的正确方法是什么?Stdlib.(a = b)可以工作,但感觉很麻烦,因为多态相等运算符非常常用。

Jef*_*eld 5

这不是 OCaml 的固有行为。它来自 Jane Street Base(大概还有来自 Jane Street 的其他模块),它覆盖了一些内置的多态函数。

这个想法是,内置多态比较存在风险,如果您不小心的话,可能会令人惊讶。

要获得常用的 OCaml 多态比较运算符,您可以使用该Polymorphic_compare模块。以下是 Jane Street Base 文档的链接(如果您正在使用的话):Base at Jane Street