从操作反推类型要求
一个表达式的类型往往受到周围操作约束。函数把某个参数当作数字相加,或把某个值放进统一元素类型的列表,都为推断提供信息。编译器把这些联系结合起来,寻找一致的类型安排;若要求互相冲突,应报告错误,而不是随意挑选一种能让程序继续运行的解释。
少写声明不等于动态类型
F#文档明确说明,省略类型说明并不把语言变成动态类型。类型仍在编译时确定,只是其中一部分由编译器根据上下文得出。必要时,程序员可以增加声明以消除歧义、限定接口或说明设计意图。类型推断减少的是重复填写的工作,并没有撤销类型系统对操作的限制。
参考:[2]
推断可以保留一般性
如果函数只是把输入原样返回,它不必被限制为只接收整数;推断结果可以保留类型变量,表示输入与输出具有同一种尚未指定的类型。这样的多态类型能够支持代码复用。不过推断能力和允许的多态形式取决于语言,不能把一个例子推广为所有程序都能自动得到最一般的类型。
上下文与声明共同决定结果
字面量、函数调用和已知接口会继续收紧类型要求。F#的示例显示,改变数字字面量的类型便可能影响参数与结果的推断;信息不足时需要补充说明。阅读推断出的类型也有助于发现错误设计:函数若意外只适用于某种数值,原因可能来自内部操作,而非推断器凭空添加限制。