我读过 Rust 使用 Hindley-Milner 具有非常好的类型推断。Rust 也有可变变量,并且当 HM 算法与可变性一起工作时,AFAIK 必须有一些约束,因为它可能过度概括。以下代码:
let mut a;
a = 3;
a = 2.5;
不编译,因为在第二行推断出整数并且不能将浮点值分配给整数变量。所以我猜测对于简单的变量,一旦推断出非泛型类型,该变量就会变成单类型并且不能再被泛化。
但是像 Vec 这样的模板呢?例如这段代码:
let mut v;
v = Vec::new();
v.push(3);
v.push(2.3);
这再次失败,但最后一行再次失败。这意味着第二行部分推断出类型(Vec),第三行推断出容器类型。
有什么规律?是否有我不知道的价值限制之类的东西?还是我把事情复杂化了,而 Rust 有更严格的规则(就像根本没有概括一样)?