首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件QuickCheck属性

条件QuickCheck属性
EN

Stack Overflow用户
提问于 2012-10-15 01:57:13
回答 1查看 3.1K关注 0票数 14

我为一个函数编写了一个QuickCheck属性,该函数将两个排序的输入合并为一个排序的输出:

代码语言:javascript
复制
prop_merge xs ys =
    if (sorted xs && sorted ys) then (sorted (merge xs ys)) else True

也就是说,当输入被排序时,输出也被排序。它也可以写成:

代码语言:javascript
复制
prop_merge xs ys = not(sorted xs && sorted ys) || (sorted (merge xs ys))

但这两个版本我都不太喜欢。在QuickCheck中有没有更好的“条件属性”语法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-15 02:05:46

可以使用==>运算符将布尔条件附加到属性:

代码语言:javascript
复制
prop_merge xs ys = (sorted xs && sorted ys) ==> sorted (merge xs ys)

这不仅是一种更好的语法,而且允许QuickCheck区分测试成功的测试用例和不满足前提条件的测试用例。在后一种情况下,测试不会被计算在内,QuickCheck会生成新的输入。

然而,在大多数输入不满足条件的情况下,这将导致您的测试运行得更慢,或者,如果丢弃了足够多的输入,QuickCheck最终将放弃。由于随机列表不太可能排序,因此上面的示例很可能会发生这种情况:

代码语言:javascript
复制
> quickCheck (prop_merge :: [Int] -> [Int] -> Property)
*** Gave up! Passed only 15 tests.

(请注意,使用标准的布尔运算符而不是使用==>,QuickCheck将提高所有通过的测试,而大多数测试由于失败的前提条件而无用)

因此,通常直接生成您需要的测试用例要好得多。对于简单的情况,Test.QuickCheck.Modifiers模块包含几个有用的新类型,它们修改了生成输入的方式。例如,OrderedList修饰符将只生成排序列表,因此我们可以简单地将您的属性写为:

代码语言:javascript
复制
prop_merge (Ordered xs) (Ordered ys) = sorted (merge xs ys)
票数 33
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12884927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档