QuickCheck 从静态排列列表生成

QuickCheck to Generate from Static Permutations List

假设我有以下数据类型:

data A = A1 | A2 | A3
data B = B1 A | B2 A

我可以轻松生成B的所有可能性的列表。我想测试所有可能的排列,但我仍然想使用QuickCheck吐出应用它的列表中的所有元素。在这种情况下,我想测试一条规则是否适用于所有可能性,因此我不想生成随机数据。

假设我已经拥有列表中的所有可能性,我怎样才能使 QuickCheck 只输出列表中的每个元素一次?每次都给出完全相同的一组值。

大概你有这样的东西:

prop_for_b :: B -> Bool
prop_for_b = undefined

test_for_b :: IO ()
test_for_b = quickCheck prop_for_b

您可以在普通 Bool 上使用 quickCheck 及其变体,它只会巧妙地只 运行 一个 "test";因此:

prop_for_all_bs :: Bool
prop_for_all_bs = all prop_for_b [{- ... -}]

test_for_all_bs :: IO ()
test_for_all_bs = quickCheck prop_for_all_bs