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

标签 haskell type-safety gadt property-based-testing haskell-hedgehog

我有这样的 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 中做些什么来尽可能地消除这里的缺点?最好使用此模块中的生成器:
  • https://hackage.haskell.org/package/hedgehog-0.5.1/docs/Hedgehog-Gen.html
  • 最佳答案

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

    最后一点,不要生成一个整数然后将其映射到一个值,而是使用 oneofelement .

     element [MkAnyType TInt, MkAnyType TBool]
    

    关于haskell - 使用 Hedgehog(或任何其他基于属性的测试框架)生成随机 GADT 的最安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48241882/

    相关文章:

    Scala - Slick - 为包装的选项获取 TypedType [T]

    list - 在 Haskell 中,[0.1..1] 返回 [0.1,1.1]。为什么?

    haskell - 当 thunk 被垃圾收集时,Haskell 会丢弃 Spark 吗?

    haskell 将整数转换为字符串而不显示

    java - 类型安全: The expression of type Class[] needs unchecked conversion to conform to Class<Animal>[]

    scala - 禁止生成申请案例类

    haskell - 具有 `bool` 、 `either` 等功能的模式

    haskell - (Monad m, Monoid o) => m o? 的应用实例

    f# - 与 F# 中的 Haskell GADT 和类型类最接近的是什么?

    haskell - 为什么我们使用折叠将数据类型编码为函数?