【发布时间】:2017-03-01 03:27:51
【问题描述】:
我想使用 Haskell Test.QuickCheck 生成一些示例测试
目标是生成 (Int, [Int]) 的数据,其中元组为 (x, xs) 的条件如下:
- x > 0
- x 不在 xs 中
- 所有 xs >0
一段时间后,我摸不着头脑并跌跌撞撞地翻阅手册https://github.com/stackbuilders/quickcheck-manual,我可以生成满足这些要求的随机列表:
import Test.QuickCheck
mygen = arbitrary::Gen (Int, [Int]))
sample (mygen `suchThat` ( \(x, xs)->( (x `notElem` xs) && (x > 0) && (all (>0) xs)&& (xs/=[]))))
在 GHCI 中运行最后一行会输出如下内容:
(40,[19,35,27,29,45,1,17,28])
(20,[3,9,11,12,15,8])
(43,[76,102,106,71,24,2,29,101,59,48])
(99,[5,87,136,131,22,22,133])
(77,[11,14,55,47,78,15,14])
...
问题:
如何才能更有效地做到这一点,因为 - 我猜 - 函数 mygen 创建一个大样本集,然后根据
suchThat标准过滤掉如何指示列表 xs 应具有特定大小。例如,如果我添加
&& length xs > 50,程序会运行很长时间。保证 xs 的每个元素都是唯一的。 IE。避免像 (99,[22,22]) 之类的记录
【问题讨论】:
标签: haskell testing random quickcheck