如何编写需要非零数字的非空列表的 QuickCheck 属性?

How do I write a QuickCheck property which expects a non-empty list of non-zero numbers?

这是一个 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,但我无法弄清楚语法,因此向列表添加元素的技巧.我怎样才能避免这种黑客攻击?

QuickCheck 捆绑了 NonEmptyList newtype, whose Arbitrary instance only generates non-empty lists. You can combine this with NonZero 以获得非零整数的非空列表:

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

我正在使用 coerce in a view pattern 简洁高效地将 NonEmptyList (NonZero Int) 变回 Int 的常规列表。