为什么我的 OCaml“=”运算符仅适用于 int?

Car*_*ANG 2 ocaml utop

我使用 vscode,带有“OCaml 和 Reason IDE”的扩展

这是我在 utop 中的结果:

utop # 1. = 1. ;;    
Line 1, characters 0-2:
Error: This expression has type float but an expression was expected of type
             int
Run Code Online (Sandbox Code Playgroud)

对于字符串也同样如此:

utop # "Me" = "Me";;
Line 1, characters 0-4:
Error: This expression has type string but an expression was expected of type
         int
Run Code Online (Sandbox Code Playgroud)

除 int 之外的任何内容都相同:

utop # 2 = 2 ;;
- : bool = true
Run Code Online (Sandbox Code Playgroud)

">" "<" 也有同样的症状。我不知道到底发生了什么。谁能帮我吗 ?多谢!

Vla*_*hev 7

您可能正在使用 JaneStreet Base 库。也许你是这样导入的:

open Base;;
Run Code Online (Sandbox Code Playgroud)

Base 尝试限制具有显式_exn后缀的函数的异常,因此它隐藏了内置的多态相等性(=),这可能会在某些输入上引发异常(例如,如果比较包含函数的结构)。

您可以按如下方式恢复多态相等性:

let (=) = Poly.(=);;
Run Code Online (Sandbox Code Playgroud)

或者您可以将其与本地导入一起使用:Poly.(x = y)

多态比较有利有弊。共识似乎是使用单态比较(例如,String.equal等)是一个更稳健的选择,尽管它不太方便。

  • 顺便说一句,多态比较并不是不安全的,因为它可能会导致程序崩溃,或者破坏类型系统,或者以某种方式使程序变得更弱。它只是类型不那么严格,性能也比它的具体对应物稍差一些,Janestreet 库的作者决定不使用它。 (2认同)