我正在尝试在一些嵌套的列表上运行QuickCheck,类似于这样:
type Constraint = Text
data Value = Value [Constraint]
data Literal = Literal Value [Value]
type Formula = [Literal]
因此,一个公式是一个文字列表,每个文字包含一个谓词和一些参数;谓词/参数是以字符串形式表示的约束的析取值。这给我们提供了一个列表,其中包含了多个嵌套的列表,使得阅读起来有点费劲。
如果我的 QuickCheck 属性之一失败,我往往会收到一大堆难以理解的输出。在尝试缩小(shrink)之前,我通过使用任意实例来生成仅能产生一小组(小)值的方法来解决这个问题。为我的每个类型实现 shrink 函数似乎有所帮助,但效果不如我所愿。我仍旧会获得一大堆输出。
我认为从 shrink 中想要的是一个小型的文字列表,其中每个文字都有一个小型值列表,并且每个值列表具有少量的约束条件,每个条件都尽可能短。但是,在我目前的努力中,至少有一个这样的列表变得足够大,以致于输出变得非常可怕。如果我尝试调整我的 shrink 实现,我还发现 QC 开始花费很长时间(寻找 shrinks?),这在某种程度上抑制了我有效地缩小(shrink)的努力。
当您遇到像这样的嵌套数据时,如何提高您理解 QuickCheck 失败的机会呢?
?X/cat|dog
,意味着标签受限于仅与“cat”或“dog”统一(在上述简化的代码中没有标签)。除此之外,还有一个对公式进行统一的函数,以及一个扩展另一个宏数据结构(包含公式)的函数。我想检查我扩展的宏中的公式是否涵盖了原始(即模板)中的公式。 - kowey