主要观点:GHC 9.8 的进步使库作者能控制内部数据构造器如何被标记为对人类不安全但需为测试套件导出,解决了隐藏不安全构造器与测试需求之间的根本矛盾。
关键信息:
- 强类型函数式编程的原则是“使无效状态不可表示”,常隐藏数据构造器而暴露“智能构造器”。
- 复杂情况下数据类型内部在写测试用例和属性测试时仍需,如
Arbitrary
实例。 - 已有告知用户不鼓励导入的方法但存在问题,如工具无法检查、粒度不细等。
- GHC 9.8 带来提案 541 可将警告与用户定义类别关联,如
{-# WARNING in "x-unsafe-internals" <entity-name> "User-facing message" #-}
。 - 数据类型构造器与类型同名时需用
ExplicitNamespaces
扩展区分,通过type
和data
关键字在警告 pragmas 中明确。
重要细节: - 以
Positive
类型为例说明隐藏数据构造器和暴露“智能构造器”。 - 展示在测试模块中实现
Arbitrary
实例的代码。 - 给出不同方法告知用户不鼓励导入的具体形式及存在的问题。
- 详细说明在代码中使用警告 pragmas 标记数据构造器为“仅用于测试导出”及效果,包括在不同模块中的情况和抑制警告的方法。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。