Rust的类型推断如何跨多个语句工作?

Ker*_* SB 16 type-inference rust

Rust在相当高级的情况下执行类型推断.有人可以解释(或指向)描述可以和不可推断的内容的规则吗?

第一个很简单:绑定的类型是绑定表达式的类型:

let n = 10u32;

// Same as:
//   vvvvv
let n: u32 = 10u32;
Run Code Online (Sandbox Code Playgroud)

下一个对我来说更令人惊讶:右边的泛型参数是从左边的绑定类型中推导出来的:

let n: u32 = "10".parse().unwrap();

// same as:            vvvvvvv
let n: u32 = "10".parse::<u32>().unwrap();
Run Code Online (Sandbox Code Playgroud)

这也适用于泛型类型的"成员函数":

let b = Box::new(10u32);

// same as:
//        vvvvv      vvvvvvv
let b: Box<u32> = Box::<u32>::new(10u32);
Run Code Online (Sandbox Code Playgroud)

但最奇怪的是跨语句的类型推断:

let v = Vec::new();   // no type!
v.push(10u32);        // apparently v is Vec<u32>?!
// v.push(10i32);     // type error
Run Code Online (Sandbox Code Playgroud)

类型推断和类型推导的规则是什么?

Hau*_*eth 5

Rust使用Hindley-Milner型系统.它是一组关于根据其用法建立表达式类型的规则.

可以在那里找到它的形式描述和解释:

"你不明白欣德利 - 米尔纳的哪一部分?"