-->

测试快速检查属性对多种类型的?(Testing QuickCheck properties agai

2019-07-18 15:12发布

我有一个类型Atomic ,这对于从一个包装值(将某些类型/定义功能Atom )。 我想定义它规定一个快速检查属性:“为所有实例Atomic ,任意值可以存储和检索的安全”。 该物业是这样的:

class Atomic a where
    toAtom :: a -> Atom
    fromAtom :: Atom -> Maybe a

prop_AtomIdentity x = fromAtom (toAtom x) == Just x

但是,如果我只是尝试运行通过快速检查该属性,它只是挑选一个实例( Bool ),并测试它。 我目前周围的工作定义为在测试列表中的每个支持的原子类型类型签名,但是这是冗长且容易出错:

containerTests =
    [ run (prop_AtomIdentity :: Bool -> Bool)
    , run (prop_AtomIdentity :: Word8 -> Bool)
    , run (prop_AtomIdentity :: String -> Bool)
    {- etc -} ]

我试图定义一个函数,它会自动执行此操作:

forallAtoms :: (Atomic a, Show a) => (a -> Bool) -> [TestOptions -> IO TestResult]
forallAtoms x =
    [ run (x :: Bool -> Bool)
    , run (x :: Word8 -> Bool)
    , run (x :: String -> Bool)
    {- etc -} ]

containerTests = forallAtoms prop_AtomIdentity

但它失败,一个类型检测错误:

Tests/Containers.hs:33:0:
    Couldn't match expected type `Word8' against inferred type `String'
    In the first argument of `run', namely `(x :: Word8 -> Bool)'
    In the expression: run (x :: Word8 -> Bool)
    In the expression:
        [run (x :: Bool -> Bool), run (x :: Word8 -> Bool),
         run (x :: String -> Bool)]

有没有更好的方法来测试对多种类型的一个QC财产? 如果没有,可以forallAtoms进行工作,或者是不被类型系统支持?

Answer 1:

我不能编译你的代码,所以...盲拍:

尝试

forallAtoms :: (forall a. (Atomic a, Show a) => a -> Bool) -> [TestOptions -> IO TestResult]

作为一种类型的签名。 这就需要-XRankNTypes语言扩展。

你有,因为我看到的问题是,GHC试图找到一种插入了ax :: (a -> Bool)整个功能范围,但你已经给三个不同的存在。



文章来源: Testing QuickCheck properties against multiple types?