Joh*_*kin 12 testing haskell quickcheck
我有一个类型类Atomic
,它定义了将某些类型转换为包装器值(/ Atom
)的函数.我想定义一个QuickCheck属性,该属性指出:"对于所有实例Atomic
,可以安全地存储和检索任何值".该属性如下所示:
class Atomic a where
toAtom :: a -> Atom
fromAtom :: Atom -> Maybe a
prop_AtomIdentity x = fromAtom (toAtom x) == Just x
Run Code Online (Sandbox Code Playgroud)
但是,如果我只是尝试通过QuickCheck运行该属性,它只需选择一个实例(Bool
)并对其进行测试.我目前正在通过为测试列表中的每个受支持的原子类型定义类型签名来解决这个问题,但这很冗长且容易出错:
containerTests =
[ run (prop_AtomIdentity :: Bool -> Bool)
, run (prop_AtomIdentity :: Word8 -> Bool)
, run (prop_AtomIdentity :: String -> Bool)
{- etc -} ]
Run Code Online (Sandbox Code Playgroud)
我正在尝试定义一个自动执行此操作的函数:
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
Run Code Online (Sandbox Code Playgroud)
但它失败了一个类型检查错误:
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)]
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来针对多种类型测试QC属性?如果没有,可以使forallAtoms工作或类型系统不支持?
Rüd*_*nke 12
我无法编译你的代码,所以...盲目拍摄:
尝试
forallAtoms :: (forall a. (Atomic a, Show a) => a -> Bool) -> [TestOptions -> IO TestResult]
Run Code Online (Sandbox Code Playgroud)
作为类型签名.这需要-XRankNTypes语言扩展.
这个问题你有,在我看来,是GHC试图找到一个类型插入用于a
在x :: (a -> Bool)
整个功能范围,但你已经给三个不同的存在.
归档时间: |
|
查看次数: |
1391 次 |
最近记录: |