使Test.QuickCheck.Batch使用默认类型来测试列表函数

时间:2008-09-15 15:59:53

标签: testing haskell type-inference quickcheck

我正在测试一个名为extractions的函数,它可以在任何列表上运行。

extractions :: [a] -> [(a,[a])]
extractions [] = []
extractions l = extract l []
    where extract [] _ = []
          extract (x:xs) prev = (x, prev++xs) : extract xs (x : prev)

我想测试它,例如,用

import Test.QuickCheck.Batch    
prop_len l = length l == length (extractions l)
main = runTests "extractions" defOpt [run prop_len]

但这不会编译;我必须为runprop_len提供类型,因为QuickCheck无法生成[a],因此必须生成具体的内容。所以我选择Int

main = runTests "extractions" defOpt [r prop_len]
    where r = run :: ([Int] -> Bool) -> TestOptions -> IO TestResult

有没有办法让QuickCheck为我选择a而不是在run类型中指定它?

1 个答案:

答案 0 :(得分:7)

quickcheck manual说“不”:

  

属性必须具有单形类型。 “多态”属性(例如上面的属性)必须限制为用于测试的特定类型。通过在

中声明一个或多个参数的类型来方便      

其中types =(x1 :: t1,x2 :: t2,...)

     

...子句