首页 > 解决方案 > 如何编写需要非零数字的非空列表的 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

这迫使积极,我尝试结合一堆东西来得到listOf1and NonZero,但我无法弄清楚语法,因此黑客将元素添加到列表中。我怎样才能避免这种黑客攻击?

标签: haskellquickcheck

解决方案


QuickCheck 捆绑了一个NonEmptyList新类型,它的Arbitrary实例只生成非空列表。您可以将其与NonZero获取非零整数的非空列表:

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

coerce视图模式中使用以简洁有效地将NonEmptyList (NonZero Int)背面转换为 s 的常规列表Int


推荐阅读