作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为我编写的二分搜索函数编写测试。
module Tests where
import Data.List (sort)
import Test.QuickCheck
import BinarySearch (binarySearch)
prop_equals_elem x xs = (binarySearch x $ sort xs) == (x `elem` xs)
args = Args {replay = Nothing, maxSuccess = 200, maxDiscard=200, maxSize=200, chatty = False}
main = do
quickCheck (prop_equals_elem :: (Ord a) => a -> [a] -> Bool)
在 ghci 中使用 QuickCheck 效果很好,但是当我尝试运行 main 时,它给出了错误
Tests.hs:12:5:
Ambiguous type variable `a0' in the constraints:
(Arbitrary a0) arising from a use of `quickCheckWith'
at Tests.hs:12:5-18
(Show a0) arising from a use of `quickCheckWith'
at Tests.hs:12:5-18
(Ord a0) arising from an expression type signature
at Tests.hs:12:26-72
为什么这在 main 中不起作用,但在 ghci 中却起作用?
最佳答案
这可能是由 extended defaulting rules in GHCi 引起的.
当测试这样的函数时,您需要使用具体的元素类型。由于扩展规则,GHCi 会将元素类型默认为 ()
,但正常编译代码时不会发生这种情况,因此 GHC 告诉您它无法确定要使用哪种元素类型。
例如,您可以使用 Int
来代替测试。 ()
对于测试此函数来说非常无用,因为所有元素都是相同的。
quickCheck (prop_equals_elem :: Int -> [Int] -> Bool)
如果它适用于 Int
,那么由于参数性,它应该适用于任何类型。
关于haskell - 如何在main中使用quickcheck,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7149751/
我是一名优秀的程序员,十分优秀!