我们有两个比较两个不同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,但是在本教程中,我将向您展示如何创建自己的Generator。 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/

10-10 02:30