【问题标题】:How do I write a QuickCheck property which expects a non-empty list of non-zero numbers?如何编写需要非零数字的非空列表的 QuickCheck 属性?
【发布时间】:2018-08-09 18:53:17
【问题描述】:

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

【问题讨论】:

    标签: haskell quickcheck


    【解决方案1】:

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

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

    我在view pattern 中使用coerce 来简洁有效地将NonEmptyList (NonZero Int) 转换回Ints 的常规列表。

    【讨论】:

    • 或者,对于使用 Data.Function.on 的导入而不是启用视图模式的类似难以理解的实现:propCheck ns = ((==) `on` ($ coerce ns)) cogsRpm go
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多