Coq :> 符号
The Coq :> symbol
这可能非常简单,但我找不到任何关于“:>”符号在 Coq 中的含义的信息。
有什么区别:
U:类型
和
W :> 类型
?
这取决于符号出现的位置。例如,如果它在记录声明中,它会指示 Coq 添加相应的记录投影作为强制转换。
具体来说,假设我们定义了以下带有操作的类型:
Record foo := Foo {
sort :> Type;
op : sort -> sort -> sort
}.
我们现在可以编写以下函数,它应用结构的操作两次:
Definition bar (T : foo) (x y z : T) : T :=
op foo x (op foo y z).
通过使用 :>
符号,我们指示 Coq 读取 bar
的定义如下:
Definition bar' (T : foo) (x y z : sort T) : sort T :=
op foo x (op foo y z).
也就是说,Coq 知道每个 T : foo
都可以出现在它期望类型的位置,方法是将它环绕在 sort
投影周围。如果我们使用 :
而不是 :>
,Coq 只会接受 bar'
,而 bar
会引发类型错误。
这可能非常简单,但我找不到任何关于“:>”符号在 Coq 中的含义的信息。 有什么区别: U:类型 和 W :> 类型 ?
这取决于符号出现的位置。例如,如果它在记录声明中,它会指示 Coq 添加相应的记录投影作为强制转换。
具体来说,假设我们定义了以下带有操作的类型:
Record foo := Foo {
sort :> Type;
op : sort -> sort -> sort
}.
我们现在可以编写以下函数,它应用结构的操作两次:
Definition bar (T : foo) (x y z : T) : T :=
op foo x (op foo y z).
通过使用 :>
符号,我们指示 Coq 读取 bar
的定义如下:
Definition bar' (T : foo) (x y z : sort T) : sort T :=
op foo x (op foo y z).
也就是说,Coq 知道每个 T : foo
都可以出现在它期望类型的位置,方法是将它环绕在 sort
投影周围。如果我们使用 :
而不是 :>
,Coq 只会接受 bar'
,而 bar
会引发类型错误。