gpt4 book ai didi

针对多种类型测试 QuickCheck 属性?

转载 作者:行者123 更新时间:2023-11-28 19:41:48 25 4
gpt4 key购买 nike

我有一个类型类 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 工作或者类型系统不支持?

最佳答案

我无法编译你的代码,所以......盲目拍摄:

尝试

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

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

在我看来,您遇到的问题是 GHC 试图找到 一个 类型以插入 a in x::(a -> Bool) 用于整个函数范围,但您已经在那里给出了三个不同的。

关于针对多种类型测试 QuickCheck 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1449156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com