7

为什么没有QuickCheck类似于hedgehog's的功能success?特别是我想知道如何翻译如下属性:

prop_specialPair :: Property
prop_specialPair = property $ do
  (_, xs) <- forAll specialPair
  case xs of
    x:_ -> x /== 3
    _   -> success

如果QuickCheck我使用=/=then 我被迫返回一些 type 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

4

2 回答 2

8

您可以使用类中的property函数Testable和各种Testable实例来创建Property具有您需要的任何特征的函数。

例如,property ()总是成功。再举一个例子,property (b :: Bool)成功 iff 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
于 2019-12-17T23:02:40.660 回答
1

您还可以将含义与(==>)

prop_specialPair :: Property
prop_specialPair =
  forAll specialPair $ \(_, xs) ->
    not (null xs) ==> take 1 xs =/= [3]
于 2019-12-18T11:49:56.600 回答