如何编写需要非零数字的非空列表的 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
这强制肯定,我尝试组合一堆东西来获得 listOf1
和 NonZero
,但我无法弄清楚语法,因此向列表添加元素的技巧.我怎样才能避免这种黑客攻击?
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
的常规列表。
这是一个 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
这强制肯定,我尝试组合一堆东西来获得 listOf1
和 NonZero
,但我无法弄清楚语法,因此向列表添加元素的技巧.我怎样才能避免这种黑客攻击?
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
的常规列表。