使用 QuickCheck 仅生成正整数
Only generate positive integers with QuickCheck
我们有两个函数比较两个不同的 power
函数,如果它们 return 相同的值(在相同的输入上),则 return 为真。
然后我们有另外两个函数针对两个列表测试这些函数,看看是否有任何值不 return 为真。
但我们不想使用使用范围 [1..100]
的列表,而是使用 QuickCheck。
是否可以只使 QuickCheck return 正整数?
代码:
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)
我们有两个函数比较两个不同的 power
函数,如果它们 return 相同的值(在相同的输入上),则 return 为真。
然后我们有另外两个函数针对两个列表测试这些函数,看看是否有任何值不 return 为真。
但我们不想使用使用范围 [1..100]
的列表,而是使用 QuickCheck。
是否可以只使 QuickCheck return 正整数?
代码:
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)