如何解决在 Ocaml 中使用比较运算符会产生类型错误
我是在 MacOS 上使用 OCaml 4.12.0 的 OCaml 初学者。此 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 标准库)时,比较运算符及其朋友(如各种相等运算符)仅适用于 int 类型的值.对于所有其他值,您必须使用实现该类型的模块提供的专门比较运算符,例如,比较两个浮点数,
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 模块中的 float 定义的。
此外,符号 Foo.(<expr>)
是 let open Foo in <expr>
的简写,称为 local open。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。