【发布时间】:2019-10-11 18:14:09
【问题描述】:
我正在尝试理解类型推断的规则,因为我想将其融入我自己的语言中,并且本着这种精神,我一直在玩 F# 的类型推断,下面的内容让我觉得很奇怪。
这样编译,id 是 '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
您能否解释一下(最好是非学术性的)规则是什么,以及从类型检查实现的角度来看它是如何工作的?每次引用它们时,它是否会遍历函数来检查它们的类型?还是有其他方法?
【问题讨论】:
-
@glennsl 我在问之前读过那个,觉得问题和答案比我问的要复杂得多。
-
是的,虽然这个问题经常被问到,但提供的链接只与问题的标题有关。例如:stackoverflow.com/questions/6285493/type-of-addition-in-f
标签: f# type-inference typechecking static-typing hindley-milner