精益定义中的类型问题
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
的类型中
如果我定义
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
的类型中