[英]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)
然后生成从0
到1
(包括)的随机数,并根据整数值创建AnyType
。 像这样:
intToAnyType :: Int -> AnyType
intToAnyType 0 = MkAnyType TInt
intToAnyType 1 = MkAnyType TBool
intToAnyType _ = error "Impossible happened"
但这种方法对我来说有几个缺点:
TType
数据类型添加另一个构造函数,我可能忘记修复测试,编译器不会警告我这一点。 intToAnyType 1 = MkAnyType TInt
。 error
。 Int
类型对我来说太宽泛了。 让这种模式匹配详尽无遗是件好事。 我可以在Haskell中做些什么来消除尽可能多的缺点? 最好使用此模块的发电机:
使用Template Haskell生成genTType
可能是自动维护生成器的最佳选择,因为GADT没有通用的编程支持。
对于您的最后一点,请使用oneof
或element
,而不是生成整数然后将其映射到值。
element [MkAnyType TInt, MkAnyType TBool]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.