gpt4 book ai didi

haskell - 如何在 Haskell Test.QuickCheck 中有效地生成随机测试

转载 作者:行者123 更新时间:2023-11-28 19:56:05 25 4
gpt4 key购买 nike

我想使用 Haskell Test.QuickCheck 生成一些示例测试

目标是生成 (Int, [Int]) 的数据,条件如下,元组为 (x, xs):

  1. x > 0
  2. x 不在 xs 中
  3. 所有 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])
...

问题:

  1. 如何才能更有效地完成这项工作,因为 - 我猜 - 函数 mygen 创建了一个大样本集,然后根据 suchThat 标准过滤掉

  2. 如何指示列表 xs 应具有特定大小。例如,如果我添加 && length xs > 50 程序会运行很长时间。

  3. 保证 xs 的每个元素都是唯一的。 IE。避免像 (99,[22,22]) 这样的记录

最佳答案

是的,假设生成的数字是正数的概率是 1/2,那么得到 50 个正数列表的概率是 (1/2)^50,即 1,125,899,906,842,624 中的 1。所以是的,那不会发生。

与其生成列表并过滤它们,我建议通过转换生成器来构建您需要的列表。

mygen :: Gen (Int, [Int])
mygen = do
x <- getPositive <$> arbitrary
xs <- delete x <$> replicateM 50 (getPositive <$> arbitrary)
return (x, xs)

现在您可以保证立即获得符合您条件的列表。

至于唯一性,参见Data.List.nub .您也可以考虑使用 Data.Set ,因为您似乎正在以这种方式使用它。

关于haskell - 如何在 Haskell Test.QuickCheck 中有效地生成随机测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42516835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com