我正在测试一个名为“提取”的函数,该函数可以在任何列表上运行。

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?

有帮助吗?

解决方案

快速检查手册 说“不”:

属性必须具有单态类型。“多态”属性,例如上面的属性,必须限制为用于测试的特定类型。通过在一个变量中声明一个或多个参数的类型可以很方便地做到这一点

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

条款...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top