我编写了一个算法来找到Haskell中子集和问题的解决方案。签名是控制在QuickCheck中如何生成测试数据
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。在Haskell Wiki上有A Tutorial,但没有太多细节,只是在实例化Arbitrary
时有几个字。
所以我有两个问题:
- 什么快速检查2改变使其成为比快速检查这么多慢?
- 什么是控制数据集创建以使其对给定测试有用的最佳方法?
编辑:更具体地讲,我想测试我的解决方案,从0到100的列表大小,-10000和10000
您的问题似乎是快速检查的背景下,有点含糊;也许你会更好地问一个普通的测试问题。尽管目前的方法存在一些问题:它不会检查解决方案是否是一个子集,或者如果函数返回Nothing,那么实际上没有解决方案。 – gatoatigrado 2012-04-02 19:37:07
@gatoatigrado该属性只是一个例子。我相信检查解决方案是一个子集属于另一个属性。我错了吗?我没有看到一个简单的方法来检查什么时候没有返回,实际上没有解决方案,除了用另一种算法再次解决问题。这似乎有点多余。 – Antoine 2012-04-03 04:56:18
http://stackoverflow.com/questions/10712373/cookbook-for-converting-from-quickcheck1-to-quickcheck2 – gliptak 2016-08-28 12:54:13