如何编写一个QuickCheck属性,该属性期望一个非零数字的非空列表?

时间:2018-08-09 18:53:18

标签: haskell quickcheck

这是一个hack(cogsRpm是用户提供的函数,应该与go的输出匹配):

propCheck ns = cogsRpm (ns ++ [42])  == go (ns ++ [42])

我添加了42以阻止快速检查生成零长度列表。不过它也可能会失败,因为它也不应该在其中也有零。

我阅读了文档,但是没有足够的示例可供我解析如何实际使用它们。我确实设法在另一个案例中得到了这个答案:

prop_check (Positive x) (Positive y)  = updateHealth x y == if y > x then 0 else x-y

这会强制肯定,因此我尝试结合了很多东西来获得listOf1NonZero,但是我无法弄清楚语法,因此黑客将一个元素添加到列表中。我该如何避免这种入侵?

1 个答案:

答案 0 :(得分:6)

QuickCheck与NonEmptyList新类型捆绑在一起,新类型的Arbitrary实例仅生成非空列表。您可以将其与NonZero结合使用以获得非零整数的非空列表:

propCheck :: NonEmptyList (NonZero Int) -> Bool
propCheck (coerce -> ns) = cogsRpm ns == go ns

我正在coerce中使用view pattern,以简洁高效地将NonEmptyList (NonZero Int)转换成Int s的常规列表。