为什么具有多态签名的QuickCheck测试在失败时会通过?

时间:2014-10-04 13:22:08

标签: haskell quickcheck

考虑到使用QuickCheck的以下测试代码,我认为prop_Max errMax失败,因为errMax的定义不正确。

当我使用具有类型prop_Max的{​​{1}}的给定签名时,会发生这种情况。然而,当我使用Int给它更多的多态注释类型时,测试通过。这是为什么?

Ord

1 个答案:

答案 0 :(得分:4)

问题在于默认

默认情况下,ghci会启用ExtendedDefaultRules扩展程序。这意味着,使用基于Ord的常规类型签名,a类型变量默认为()类型。

由于类型()的唯一有效值是值(),因此即使对于max的定义,您的测试也会通过,这种定义在更复杂的类型上是不正确的。

使用QuickCheck测试,您通常应该明确表示您希望测试运行的类型。因此,您可以保留prop_Max的多态签名,但在致电Int时明确选择quickCheck

quickCheck (prop_Max (errMax :: Int -> Int -> Int))