繁体   English   中英

如何在main中使用quickcheck

[英]How to use quickcheck in main

我正在编写一个我写的二进制搜索函数的测试。

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

为什么这不是主要的,但在ghci中呢?

这可能是由GHCi中延长的违约规则引起的。

在测试这样的函数时,需要使用具体的元素类型。 由于扩展规则,GHCi会将元素类型默认为() ,但在正常编译代码时不会发生这种情况,因此GHC告诉您它无法确定要使用的元素类型。

例如,您可以使用Int代替测试。 ()对于测试这个函数是没有用的,因为所有元素都是相同的。

quickCheck (prop_equals_elem :: Int -> [Int] -> Bool)

如果它适用于Int ,由于参数化,它应适用于任何类型。

运行QuickCheck测试时,QuickCheck需要知道如何生成数据。 在这里,您只告诉它您的代码应该使用任意类型的Ord类型,这对于它开始测试是不够的。 因此关于模糊类型类的错误。

如果您只需要一个任意的Ord实例,就像它在这里看到的那样,那么像Int这样的东西将是您测试的不错选择。 这是一个带线性顺序的简单类型。 因此,尝试在main中将您的类型修复为Int ,如:

quickCheck (prop_equals_elem :: Int -> [Int] -> Bool)

至于它为什么在GHCi中工作,答案是默认的。 GHCi尽可能将类型变量默认为() ,以避免在您真正不关心值的情况下给出虚假错误。 实际上这是一个糟糕的选择:你不会只用()类型测试来测试任何有趣的东西! 再次,显式类型签名更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM