单例中的隐式参数 class

Implicit parameter in singleton class

当我用通常的语法创建一个只有一个方法的类型类时,我可以给它隐式参数:

Class Foo1 := { foo1 {n} : Int n }.

但是当我使用单例语法时,我不能给它隐式参数

Fail Class Foo2 := foo2 {n} : Int n.

Error: Syntax error: '.' expected after [gallina] (in [vernac_aux]).

我什至无法使用 Arguments 使该参数隐式化:

Class Foo3 := foo3 n : Int n.
Fail Arguments foo3 {n}.

The command has indeed failed with message: Flag "rename" expected to rename Foo3 into n.

它以这种方式工作是否有原因?

第二次尝试

您的第二次尝试可以通过移动冒号另一侧的 n 来实现:

Class Foo2 := foo2 : forall {n}, Int n.

第 3 次尝试

错误消息告诉您使用 rename 标志。这是因为 foo3 实际上将 Foo3(它从中投影的类型类实例)作为整数之前的第一个(隐式)参数。这第一个参数恰好已经有了一个名字(Foo3),正如你可以看到 运行 About foo3.

About foo3.
(*
foo3 : Foo3 -> forall n : nat, Int n

Arguments foo3 {Foo3} _%nat_scope
*)

因此 Coq 认为您想将 that 参数重命名为 n。如果那真的是你想要的,你可以按照建议使用 rename 标志来做到这一点:

Arguments foo3 {n} : rename.

之后 About foo3. 将产生:

foo3 : Foo3 -> forall n0 : nat, Int n0

Arguments foo3 {n} n%nat_scope
  (where some original arguments have been renamed)

但您真正想要的是通过隐式影响 second 参数。在此过程中,您不想给它一个新名称(不需要,它已经被命名为 n),并且您不想更改第一个参数(即您保持隐式并避免重命名它)。因此,你应该做的是:

Arguments foo3 {_ _}.

屈服

Arguments foo3 {Foo3} {n}%nat_scope