在 Ocaml 中使用比较运算符会产生类型错误

Using comparison operator in Ocaml produces type error

我是 OCaml 初学者,在 MacOS 上使用 OCaml 4.12.0。这个 let 表达式:

let gg x y = (x -. y) < 5.0 

在顶层导致:

Error: This expression has type float but an expression was expected of type
         int

显式添加类型信息等未解决问题。无奈之下访问了网上的REPL TryOCaml,表达式被无误接受,返回类型签名为:

val f : float -> float -> bool = <fun>

符合预期。但我希望 utop 可以在 Mac 上工作 - 我错过了什么?

很可能您使用的库覆盖了 OCaml 中 < 的内置含义。有些人(不是我)认为多态比较运算符是个问题。

这个(恕我直言)的一个问题是它会导致像这样令人困惑的结果。

例如,Jane Street Base 库被记录为覆盖多态比较运算符:https://ocaml.janestreet.com/ocaml-core/latest/doc/base/index.html

当您使用 Base(或 Core,或 Core_kernel 和其他 Janestreet 标准库)时,比较运算符及其朋友(如各种相等运算符)仅对值起作用输入整数。对于所有其他值,您必须使用实现该类型的模块提供的专门比较运算符,例如,比较两个浮点数,

Float.(3.14 < 4.14)

比较字符串,

String.("hello" <> "world")

并且,使用您的示例,

let gg x y = Float.(x -. y < 5.0)

甚至

let gg x y = Float.(x - y < 5.0)

请注意,我们不再需要使用丑陋的 -. 运算符,可以使用 -(和其他算术运算符),因为它们都是在模块 Float 中专门为浮点数定义的。

此外,符号Foo.(<expr>)let open Foo in <expr>的简写,称为local open