我正在使用QuickCheck v1.这是一个简单的prop_xxx定义如下:
prop_foo :: (Num a) =>[a] -> Bool
prop_foo xs = (reverse.reverse) xs == id xs
Run Code Online (Sandbox Code Playgroud)
这可以在GHCi中正确测试:quickCheck prop_foo
但是,当我尝试在以下函数中包装调用时:
f :: IO ()
f = quickCheck prop_foo
Run Code Online (Sandbox Code Playgroud)
它报告了错误:
Ambiguous type variable `a' in the constraints:
`Num a' arising from a use of `prop_foo' at Foo.hs:147:15-22
`Arbitrary a'
arising from a use of `quickCheck' at Foo.hs:147:4-22
Probable fix: add a type signature that fixes these type variable(s)
Run Code Online (Sandbox Code Playgroud)
我应该提供类似的东西
instance Arbitrary Xxx where
arbitrary = ...
coarbitrary c = ...
Run Code Online (Sandbox Code Playgroud)
非常感谢.
- 拉里
你必须给它一个单形类型的签名,比如
prop_foo :: [Int] -> Bool
Run Code Online (Sandbox Code Playgroud)
毕竟,问题是:在你的原始版本中,哪种类型a应该quickCheck选择用于测试功能?a = Int?a = Double?别的什么?错误消息抱怨a不明确,即没有唯一的选择.