为什么没有类似于QuickCheck
的{{3}}的hedgehog
函数?特别是我想知道如何转换以下属性:
prop_specialPair :: Property
prop_specialPair = property $ do
(_, xs) <- forAll specialPair
case xs of
x:_ -> x /== 3
_ -> success
在QuickCheck
中,如果我使用success
,那么我被迫返回Property
类型的东西,并且似乎没有常量函数返回传递的属性。
所以我要么不得不诉诸Bool
类型:
prop_specialPair :: SpecialPair -> Bool
prop_specialPair SpecialPair { xs } =
case xs of
x:_ -> x == 3
_ -> True
或者对success
使用非常笨拙的编码,例如:
prop_specialPair :: SpecialPair -> Property
prop_specialPair SpecialPair { xs } =
case xs of
x:_ -> x =/= 3
_ -> True === True
在QuickCheck
中是否有更好的方式来表达属性?
答案 0 :(得分:8)
您可以使用property
类中的Testable
函数和各种Testable
实例来创建具有所需特性的Property
。
例如,property ()
总是成功。再举一个例子,property (b :: Bool)
在b == True
之后成功。
例如,您可以这样做:
prop_specialPair :: SpecialPair -> Property
prop_specialPair SpecialPair { xs } =
case xs of
x:_ -> x =/= 3
_ -> property ()
或者您可以通过使用Testable Result
实例和值succeeded :: Result
使其更明确:
prop_specialPair :: SpecialPair -> Property
prop_specialPair SpecialPair { xs } =
case xs of
x:_ -> x =/= 3
_ -> property succeeded
答案 1 :(得分:1)
您还可以对(==>)
使用暗示:
prop_specialPair :: Property
prop_specialPair =
forAll specialPair $ \(_, xs) ->
not (null xs) ==> take 1 xs =/= [3]