eps*_*lbe 6 haskell quickcheck
我有一个具有以下类型签名的函数
rndListIndex :: Double -> Double -> Double -> Double
rndListIndex maxIdx r1 r2 = …
该函数具有的属性
prop_alwaysLessThanMaxIdx idx r1 r2 = (rndListIndex idx r1 r2 <= idx)
我怎么生成随机数据maxIdx和r1,r2分开; 我知道函数,choose但不知道如何将它与多个输入变量一起使用.
现在我已经测试了固定的属性idx,这不是应该测试的方式.
ben*_*ofs 13
您必须使用QuickCheck中的forAll函数.它有以下类型:
forAll :: (Show a, Testable prop) 
       => Gen a           -- ^ The generator to use for generating values
       -> (a -> prop)     -- ^ A function which returns a testable property
       -> Property                  
forAll 有两个参数:
使用choose和elements生成器嵌套forAll的示例:
-- This generates a Property p for all x's in the closed interval [1,3]
-- The property p in turn generates a property q for all y ? [4,5]
-- The property q is True if x < y.
prop_choose = forAll (choose (1,3)) $ \x ->
              forAll (elements [4,5]) $ \y -> x < y
对于您的测试属性,您可以使用forAll选择第二个和第三个参数.对于第一个参数,Positive aQuickCheck中的类型可用于生成类型a的任意正值(当a为Num时,它具有任意实例):
prop_alwayLessThanMaxIdx :: Positive Integer -> Property
prop_alwaysLessThanMaxIdx (Positive idx) = 
  forAll (choose (0,1)) $ \r1 ->
  forAll (choose (0,1)) $ \r2 ->
   (rndListIndex idx r1 r2) < idx