types - Coq 中的类型封装

标签 types module encapsulation coq

有没有一种方法可以在 Coq 模块中定义类型但封装构造函数?

我希望模块的客户端能够使用该类型但不能构造该类型的成员,类似于在 OCaml 中使用抽象类型可以完成的操作。

最佳答案

是的。您可以在模块中定义您的类型并为其分配模块类型:

Module Type FOO.

Variable t : Type.

End FOO.

Module Foo : FOO.

Inductive typ :=
| T : typ.

Definition t := typ.

End Foo.

(* This fails *)
Check Foo.T.

另一种可能性是将您的模块类型声明为依赖记录并通过合适的实现参数化您的开发,例如

Record FOO := { t : Type }.

Section Defs.

Variable Foo : FOO.

(* Code ... *)

End Defs.

(* Instantiate FOO *)

Definition Foo := {| t := nat |}.

严格来说,这并没有隐藏类型的构造函数,但只要您的客户只是使用接口(interface)编写他们的定义,他们就无法引用您的具体实现。

关于types - Coq 中的类型封装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30200952/

相关文章:

python - 在 Maya 中导入 python 模块并被识别时出现问题

python - 如何在模块中的函数内使用模块的位置 - python

java - 封装构造函数错误

c++ - Python 参数类型 C++ 签名

mysql - mysql 中 int(11) 列的大小是多少(以字节为单位)?

types - Agda 中的大小类型是什么?

python - 如何正确使用装饰器? (类型错误: wrapper() takes 0 positional arguments but 1 was given)

php - 为什么 PHP 不允许私有(private) const?

java - 封装可执行文件

java - Java 中可以声明多类型变量吗?