haskell - 使用 QuickCheck 仅生成正整数

标签 haskell testing quickcheck

我们有两个函数比较两个不同的 power 函数,如果它们返回相同的值(在相同的输入上),则返回 true。

然后我们有另外两个函数,它们针对两个列表测试这些函数,看看是否有任何值不返回 true。

但我们不想使用范围 [1..100] 的列表,而是使用 QuickCheck。

是否可以让 QuickCheck 只返回正整数?

代码:

comparePower1 :: Integer -> Integer -> Bool
comparePower1 n k = power n k == power1 n k

comparePower2 :: Integer -> Integer -> Bool
comparePower2 n k = power n k == power2 n k

testing1 = and [comparePower1 n k | n <- [0..100], k <- [0..100]]
testing2 = and [comparePower2 n k | n <- [0..100], k <- [0..100]]

最佳答案

QuickCheck 支持 Positive numbers ,但为了本教程,我将向您展示如何创建自己的生成器。 QuickCheck 的主要功能之一是您可以设计自己的生成器来输出您需要的内容。例如

genPos :: Gen Int
genPos = abs `fmap` (arbitrary :: Gen Int) `suchThat` (> 0)

然后你可以创建自己的列表生成器

genListOfPos :: Gen [Int]
genListOfPos = listOf genPos

最后可以使用forAll,传递生成器和利润。

main :: IO ()
main = do
  quickCheck $ forAll genPos $ \x -> x > 0
  quickCheck $ forAll genListOfPos $ all (> 0)

关于haskell - 使用 QuickCheck 仅生成正整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39291494/

相关文章:

haskell - 在 Haskell 中硬编码 map 的最有效方法是什么?

testing - Selenium 测试应该是自主的吗?

该类的java junit测试用例

haskell - 如何编写函数属性的快速检查?

队列的 Haskell 类型类

haskell - 应该如何确定是作为一个包还是多个包发布 Haskell 库?

ruby-on-rails - 为 ruby​​onrails 编写测试

haskell - 如何使我的类型成为 Arbitrary 的实例?

haskell - 如何测试这种数据类型的半群定律?

algorithm - 在椭圆内查找整数点的最有效算法