[英]Type encapsulation in 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 |}.
嚴格來說,這並不會隱藏類型的構造函數,但只要您的客戶端只使用接口編寫其定義,它們就無法引用您的具體實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.