为什么 Coq 不推断类型参数
Why Coq does not infer the type parameter
我定义了以下类型,它与 option
.
具有完全相同的结构
Inductive optionX A := NoneX | SomeX (a : A).
虽然 Check Some 1
正确推断类型参数 A,但 Check SomeX 1
生成消息
The term "1" has type "nat" while it is expected to have type "Type".
我错过了什么吗?请注意,如果我明确提供类型参数,它可以正常工作:Check SomeX(nat) 1
.
Coq 对于这种情况有一个隐式参数机制:
Inductive optionX A := NoneX | SomeX (a : A).
Arguments NoneX {A}.
Arguments SomeX {A} a. (* Curly braces means "please try to infer this" *)
Check SomeX 1.
(* You can turn off argument inference with @ *)
Check @NoneX nat. (* optionX nat *)
请注意,您之前的表达式 SomeX(nat) 1
的解析方式与 SomeX nat 1
相同,后者是应用于参数 nat
的常量 SomeX
和 1
。提供类型参数的机制与提供其他类型参数的方式相同。
reference manual 有更多关于隐式参数的信息。
我定义了以下类型,它与 option
.
Inductive optionX A := NoneX | SomeX (a : A).
虽然 Check Some 1
正确推断类型参数 A,但 Check SomeX 1
生成消息
The term "1" has type "nat" while it is expected to have type "Type".
我错过了什么吗?请注意,如果我明确提供类型参数,它可以正常工作:Check SomeX(nat) 1
.
Coq 对于这种情况有一个隐式参数机制:
Inductive optionX A := NoneX | SomeX (a : A).
Arguments NoneX {A}.
Arguments SomeX {A} a. (* Curly braces means "please try to infer this" *)
Check SomeX 1.
(* You can turn off argument inference with @ *)
Check @NoneX nat. (* optionX nat *)
请注意,您之前的表达式 SomeX(nat) 1
的解析方式与 SomeX nat 1
相同,后者是应用于参数 nat
的常量 SomeX
和 1
。提供类型参数的机制与提供其他类型参数的方式相同。
reference manual 有更多关于隐式参数的信息。