QuickCheck:为什么没有通过测试的功能,而要使用什么呢?

时间:2019-12-17 22:41:08

标签: haskell quickcheck haskell-hedgehog

为什么没有类似于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中是否有更好的方式来表达属性?

2 个答案:

答案 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]