我试图理解关于类型推断的规则,因为我想将它融入我自己的语言中,并且本着这种精神,我一直在玩 F# 的类型推断,下面的内容让我觉得很奇怪。
这会编译,并且id
is 'a -> 'a
,这(如果我没记错的话)意味着每次调用都使用“新鲜”类型。
let id x = x
let id1 = id 1
let id2 = id "two"
但是在使用运算符时,似乎第一次调用决定了该函数的签名。
在这里,mul
被报告为int -> int -> int
let mul x y = x * y
let mul1 = mul 1 2
let mul2 = mul 1.1 2.2 // fails here
如果我重新排序它们,那么mul
是float -> float -> float
:
let mul x y = x * y
let mul2 = mul 1.1 2.2
let mul1 = mul 1 2 // fails here
你能解释一下(最好是非学术性的)规则是什么,也许从类型检查实现的角度来看它是如何工作的?每次引用它们时,它是否会遍历函数来检查它们的类型?还是有其他方法?