在 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。
我是 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。