精益定义中的类型问题

Problem with types in a definition in lean

如果我定义

definition f (x : nat) := λ m, x + m

然后 #check f returns f:nat -> nat -> nat,符合预期。

如果相反,我尝试定义

definition f (x : nat) : nat -> nat -> nat := λ m, x + m

然后 Lean 抱怨说 x 的类型为 nat 但预期的类型为 nat -> nat.

这是为什么?

基本上有三种定义方式f

def f (x m : nat) : nat := x + m

def f (x : nat) : nat -> nat := λ m, x + m

def f : nat -> nat -> nat := λ x m, x + m

这三个 f 的类型都是相同的,只是定义函数的语法不同。冒号左边的所有内容都是函数的输入,冒号之后是 return 类型。 := 的右词应该在冒号后面有类型。在您的第二个示例中,:= 之后的术语类型是 nat -> nat,但预期类型是 nat -> nat -> nat,因为这是在冒号之后写的。所以出现了错误。

如果您键入 #check f.

,则冒号左侧的所有参数都包含在 f 的类型中