如何编写任意修改其任意输入的QuickCheck属性?

时间:2018-02-19 21:26:57

标签: haskell testing

假设我想验证isSubsequenceOf。然后我需要生成一些xs,然后通过任意添加或删除一些元素来生成ys。然后我可以验证由此获得的所有对的属性。使用sublistOf,我会这样:

\xs -> sublistOf xs `isSubsequenceOf` xs

- 除非这不是类型检查。

不幸的是,我不了解整体QuickCheck库的设计,即使是这些看似微不足道的案例也让我感到很困惑。我是否必须拼出Gen Result类型的成熟monadic设备?它有点违背了抽象的目的。

1 个答案:

答案 0 :(得分:2)

  

我是否必须拼出一个类型为Gen Result的完整monadic设备?

什么是“成熟的monadic设备”?是的,您应该使用Gen monad,但这并不难,并且有一个Testable实例供您使用:

mytest :: [Int] -> Gen Bool
mytest xs = do ys <- sublistOf xs
               pure $ ys `isSubsequenceOf` xs
  where isSubsequenceOf _ _ = True

使用:

*Main> quickCheck mytest
+++ OK, passed 100 tests.