Lean中函数定义类型标注报错:类型不匹配原因咨询
为什么Lean中这个显式类型标注会报错?
这个问题的核心是函数类型的右结合性以及对返回类型的误解,咱们一步一步拆解清楚:
先看第一个(正常工作的)定义
definition f (x : nat) := λ m, x + m
Lean自动推断类型时会这么分析:
x是nat类型,- 右边的
λ m, x + m是一个**接受nat参数、返回nat**的函数,类型是nat -> nat, - 所以整个
f的类型是nat -> (nat -> nat)——而因为函数类型是右结合的,A -> B -> C等价于A -> (B -> C),Lean会把它简化成nat -> nat -> nat,这就是#check f返回结果的由来。
再看第二个(报错的)定义
definition f (x : nat) : nat -> nat -> nat := λ m, x + m
这里你显式给f x指定的返回类型是nat -> nat -> nat,但这和右边的表达式类型完全不匹配:
- 你指定的
nat -> nat -> nat等价于nat -> (nat -> nat),也就是说,f x应该是一个接受nat参数、返回nat -> nat函数的对象, - 但你右边的
λ m, x + m是接受nat参数、返回nat的函数(类型nat -> nat),根本不是一个返回函数的函数, - Lean在尝试把右边表达式适配你指定的类型时,会认为
x + m必须是nat -> nat类型(因为λ m, ...的返回值需要符合nat -> nat),那x就得是nat -> nat类型才能让x + m成为函数——但x实际是nat,所以就出现了你看到的报错:x类型为nat但期望类型为nat -> nat。
正确的显式类型标注写法
如果你想给f显式标注类型,有两种正确方式:
- 给整个
f标注完整类型:
definition f : nat -> nat -> nat := λ x, λ m, x + m
或者用Lean的语法糖简化:
definition f : nat -> nat -> nat := λ x m, x + m
- 给
f x标注正确的返回类型(也就是nat -> nat):
definition f (x : nat) : nat -> nat := λ m, x + m
这时候#check f依然会返回f : nat -> nat -> nat,因为x:nat返回nat->nat,整体就是nat -> (nat->nat),也就是nat->nat->nat。
内容的提问来源于stack exchange,提问作者dumbo
相关产品推荐
相关产品推荐

