English 中文(简体)
试验 对照多种类型检查财产?
原标题:Testing QuickCheck properties against multiple types?
  • 时间:2009-09-19 18:19:40
  •  标签:

我有一类类别:<代码>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的多种类型财产? 如果不是的话,能否说服所有原子工作,或者是否得到类型系统的支持?

最佳回答

我无法编纂你的法典,因此......盲人开枪:

审判

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

签字类型。 这需要推广XRankNTypes语言。

如我所知,你面临的问题是,GHC试图为整个职能范围找到one的类型,以插入ax>(a->Bool),但你已经给出三种不同之处。

问题回答

暂无回答




相关问题
热门标签