Haskell 在QuickCheck属性内生成新的测试数据

Haskell 在QuickCheck属性内生成新的测试数据,haskell,quickcheck,Haskell,Quickcheck,我这里有个编程问题。一半的问题是问题本身很难思考,另一半是我不记得如何找到快速检查的方法 我知道,如果您编写一个函数,该函数接受多个参数,这些参数具有一个任意实例,QuickCheck将允许您使用该方法作为测试。我不知道的是如何在该方法中生成新的测试参数。我想写一些像这样的东西 prop13 :: Foo -> Bar -> Bool prop13 foo bar = if foobar foo bar then fn1 foo else newInput $ \

我这里有个编程问题。一半的问题是问题本身很难思考,另一半是我不记得如何找到快速检查的方法

我知道,如果您编写一个函数,该函数接受多个参数,这些参数具有一个
任意
实例,QuickCheck将允许您使用该方法作为测试。我不知道的是如何在该方法中生成新的测试参数。我想写一些像这样的东西

prop13 :: Foo -> Bar -> Bool
prop13 foo bar =
  if foobar foo bar
    then fn1 foo
    else newInput $ \ baz -> fn2 foo bar baz
但我不知道该怎么做

事实上,不,我真正想写的是

prop13 :: Foo -> Bar -> Property
prop13 foo bar =
  if foobar foo bar
    then label "foobar=YES" $ fn1 foo
    else label "foobar=NO"  $ newInput $ \ baz -> fn2 foo bar baz
这样我就可以检查它不是百分之百地占用一个分支或者类似的荒谬的事情

实际上,如果我能要求
baz
有一些特殊的属性,那就太好了。我模模糊糊地记得QuickCheck在某个地方有一个函数,可以丢弃不满足给定条件的输入。(唯一的问题是可能需要不合理的尝试次数才能满足条件……)

有办法做到这一点吗?我盯着黑线鳕页面,但我不知道如何得到我想要的

财产可以采取以下形式:

分类$

比如说,

prop_Insert x xs=
有序xs==>
分类(有序(x:xs))“在头部”$
分类(有序(xs++[x]))“在尾部”$
已订购(插入x x x)
其中types=x::Int

满足条件的测试用例被分配分类 给定,分类的分布在 测试。在这种情况下,结果是

Main>quickCheck属性插入
好的,通过了100次测试。58%为人头,
在尾部。尾部22%。头部为4%。

请注意,一个测试用例可以分为多个类别

(来自)

为了要求输入数据的特定属性,您可以在测试体之前添加
somePredicate data==>
,如上面的代码片段所示。另一个例子:

prop_max xs=(非.null xs)==>head(排序xs)==最大xs

你说得对,这个组合人扔掉了不合适的案子。如果这是不需要的,您可以在输入类型上创建一个
newtype
包装器,并为其重新定义
任意的
实例(请参见
正的
非空的
等示例)

我在中找到了答案。显然,这是所有人的

else forAll arbitrary $ \ baz -> fn2 foo bar baz
我只是不记得怎么做


(它还有一个很好的特性,允许我指定一个特定的随机数据生成器。)

OK,这很好地解释了如何生成正确的数据。现在如何在属性内生成新的测试数据?