OCaml 类型推理

标签 ocaml type-inference

我刚刚开始学习 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/

相关文章:

scala - 使用丰富我的库对匿名函数进行类型推断

c# - 为什么编译器无法推断自定义集合的循环变量类型?

c# - 为什么不接受 IEnumerable(of T) 作为扩展方法接收器

ocaml - 如何在 OCaml 中编写 BST 的迭代中序遍历

recursion - 在Ocaml列表中查找最大/最小编号

windows - OCaml 颜色控制台输出

file-io - 唯一基本情况是异常的递归表达式 [Context : Reading from files in OCaml]

string - 使用 OCaml 在字符串中嵌套引号?

scala - 未推断多参数闭包参数类型

switch-statement - 如何限制函数参数的类型