我最近将我的项目从 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)
可以工作,但感觉很麻烦,因为多态相等运算符非常常用。
这不是 OCaml 的固有行为。它来自 Jane Street Base(大概还有来自 Jane Street 的其他模块),它覆盖了一些内置的多态函数。
这个想法是,内置多态比较存在风险,如果您不小心的话,可能会令人惊讶。
要获得常用的 OCaml 多态比较运算符,您可以使用该Polymorphic_compare
模块。以下是 Jane Street Base 文档的链接(如果您正在使用的话):Base at Jane Street