单例中的隐式参数 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
当我用通常的语法创建一个只有一个方法的类型类时,我可以给它隐式参数:
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