我有一类类别:<代码>Atomic,其中界定了将某些类型转换成/从包装价值转换的职能(Atom
)。 我愿界定一个QuickCheck财产,该财产称:“对于<代码>Atomic的所有情况,任何价值均可安全储存和检索”。 财产就是这样:
class Atomic a where
toAtom :: a -> Atom
fromAtom :: Atom -> Maybe a
prop_AtomIdentity x = fromAtom (toAtom x) == Just x
然而,如果我只是试图通过QuickCheck来管理该财产,那么它只是举一例(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的多种类型财产? 如果不是的话,能否说服所有原子工作,或者是否得到类型系统的支持?