【问题标题】:Haskell quickCheck property for half EvensHaskell quickCheck 属性为一半 Evens
【发布时间】:2014-12-02 02:00:04
【问题描述】:

我有一个程序,它接受一个列表并将列表中的每个偶数减半

halfEvens :: [Int] -> [Int]
halfEvens xs = [if x `mod` 2 == 0 then x `div` 2 else x | x <- xs]

我想为此函数编写一个 quickCheck 属性,当且仅当该列表中没有偶数时验证初始列表和编译列表是否相等

prop_evens xs = ((halfEvens xs == xs) && (length (filter (even) xs) == 0))

我的问题是这个属性在 3 次测试后失败了。 我不知道我做错了什么。我写的属性错了吗?

【问题讨论】:

    标签: haskell quickcheck


    【解决方案1】:

    我想要 [...] 此函数的 quickCheck 属性,当且仅当该列表中没有偶数时验证初始列表和编译列表是否相等。

    这不是你要测试的。您正在测试两个属性是否成立:

    A && B
    

    但是,您要么都想要(A &amp;&amp; B),要么都不想要(not (A || B)):

    (A && B) || not (A || B) -- which is the same as A == B
    

    因此,你会测试类似的东西

    prop_evens xs = p1 == p2
      where p1 = halfEvens xs == xs
            p2 = length (filter (even) xs) == 0
    

    如果您想使用奇数列表进行测试,请使用forAll 和正确的Gen

    property $ forAll (listOf $ arbitrary `suchThat` odd) $ prop_evens
    

    【讨论】:

    • 或者,如果你想变得聪明,A == B
    • @SilvioMayolo:或者想用常识。谢谢。
    【解决方案2】:

    初始列表和编译列表相等当且仅当不存在 该列表中的偶数

    反例:[0] 包含偶数,不受halfEvens 影响。

    您需要将该属性限制为非零元素列表。 相应地利用(==&gt;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      相关资源
      最近更新 更多