为什么 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 的常量 SomeX1。提供类型参数的机制与提供其他类型参数的方式相同。

reference manual 有更多关于隐式参数的信息。