我刚刚开始学习 OCaml,我对 OCaml 编译器如何在参数可能是多种类型的某些情况下确定参数的输入类型感到困惑。我假设我需要在这些情况下明确说明类型?例如:
let sign x =
if x > 0 then 1
else if x < 0 then -1
else 0
let _ = print_int(sign 1.5)
抛出“错误:此表达式的类型为float,但表达式应为int类型”
但是比较运算符不也适用于 float 吗?为什么编译器假设参数应该是 int 而不是说参数类型不明确(除非我弄错了并且类型实际上不是不明确的)?
最佳答案
OCaml 中的内置比较运算符具有以下类型签名:
'a -> 'a -> bool
。请注意,虽然参数类型是通用的 ( 'a
),但它们是相同的。因此,当您进行类似 x < 0
的比较时,编译器看到第二个参数的类型是 int
然后推断x的类型一定是int
以及。更改比较以使用 float ,例如x < 0.
将对您的代码进行类型检查,但随后它将不再适用于 int
输入。
关于OCaml 类型推理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67353282/