考虑到使用QuickCheck的以下测试代码,我认为prop_Max errMax
失败,因为errMax
的定义不正确。
当我使用具有类型prop_Max
的{{1}}的给定签名时,会发生这种情况。然而,当我使用Int
给它更多的多态注释类型时,测试通过。这是为什么?
Ord
答案 0 :(得分:4)
问题在于默认。
默认情况下,ghci
会启用ExtendedDefaultRules
扩展程序。这意味着,使用基于Ord
的常规类型签名,a
类型变量默认为()
类型。
由于类型()
的唯一有效值是值()
,因此即使对于max
的定义,您的测试也会通过,这种定义在更复杂的类型上是不正确的。
使用QuickCheck测试,您通常应该明确表示您希望测试运行的类型。因此,您可以保留prop_Max
的多态签名,但在致电Int
时明确选择quickCheck
:
quickCheck (prop_Max (errMax :: Int -> Int -> Int))