我正在测试一个名为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]
但这不会编译; 我必须为run
或提供一个类型prop_len
,因为QuickCheck无法生成[a]
,它必须生成具体的东西.所以我选择了Int
:
main = runTests "extractions" defOpt [r prop_len] where r = run :: ([Int] -> Bool) -> TestOptions -> IO TestResult
有没有办法让QuickCheck a
为我选择而不是在类型中指定run
?
在快速检查手册说"不":
属性必须具有单形类型."多态"属性(例如上面的属性)必须限制为用于测试的特定类型.通过在a中声明一个或多个参数的类型来方便
其中types =(x1 :: t1,x2 :: t2,...)
条款...