【发布时间】:2012-04-02 13:51:36
【问题描述】:
我编写了一个算法来解决 Haskell 中的子集和问题。签名是
subsetSum :: (Ord a, Num a) => [a] -> a -> Maybe [a]
QuickCheck 似乎很适合测试它。例如,我在这里是我可以检查的属性之一:
prop_sumEqualsS l s = case subsetSum l s of
Just solution -> (sum solution) == s
Nothing -> True
问题在于该算法的计算量非常大,并且运行 100 个具有大输入列表的测试需要很长时间才能运行。
我尝试使用 QuickCheck 1,它确实运行得很快,但用于测试的数据集非常小。转移到 QuickCheck 2 后,它似乎是相反的问题。 QC 有a manual,但它似乎很旧(没有日期信息),我不知道还有多少适用于 QC2。 A Tutorial 可在 Haskell Wiki 上找到,但没有太多详细信息,只是关于实例化 Arbitrary 的几句话。
所以我有两个问题:
- QuickCheck 2 的哪些变化使它变得比 QuickCheck 慢得多?
- 控制数据集创建以使其对给定测试有用的最佳方法是什么?
编辑:更具体地说,我想测试我的解决方案,列表大小从 0 到 100,包含 -10000 到 10000 之间的整数。
【问题讨论】:
-
您的问题对于 QuickCheck 的上下文来说似乎有点模糊;也许你最好问一个一般的测试问题。但是,您当前的方法存在一些问题:它不会检查解决方案实际上是一个子集,或者如果函数返回 Nothing 那么实际上没有解决方案。
-
@gatoatigrado 该属性只是一个示例。我相信检查解决方案是否属于另一个属性的子集。我错了吗?我没有看到一种简单的方法来检查返回 Nothing 时实际上没有解决方案,除非用另一种算法再次解决问题。这似乎有点多余。
标签: haskell quickcheck