繁体   English   中英

使用Hedgehog(或任何其他基于属性的测试框架)生成随机GADT的最安全方法

[英]Safest way to generate random GADT with Hedgehog (or any other property-based testing framework)

我有像这样的GADT:

data TType a where
    TInt  :: TType Int
    TBool :: TType Bool

我想要一个像这样的功能:

genTType :: Gen (TType a)

哪个可以生成TType类型的随机构造函数。 我可以通过创建存在的合格数据类型来实现这一点

data AnyType = forall a . MkAnyType (TType a)

然后生成从01 (包括)的随机数,并根据整数值创建AnyType 像这样:

intToAnyType :: Int -> AnyType
intToAnyType 0 = MkAnyType TInt
intToAnyType 1 = MkAnyType TBool
intToAnyType _ = error "Impossible happened"

但这种方法对我来说有几个缺点:

  1. 没有外部类型安全。 如果我向TType数据类型添加另一个构造函数,我可能忘记修复测试,编译器不会警告我这一点。
  2. 编译器无法阻止我编写intToAnyType 1 = MkAnyType TInt
  3. 我不喜欢这个error Int类型对我来说太宽泛了。 让这种模式匹配详尽无遗是件好事。

我可以在Haskell中做些什么来消除尽可能多的缺点? 最好使用此模块的发电机:

使用Template Haskell生成genTType可能是自动维护生成器的最佳选择,因为GADT没有通用的编程支持。

对于您的最后一点,请使用oneofelement ,而不是生成整数然后将其映射到值。

 element [MkAnyType TInt, MkAnyType TBool]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM