quickCheck 输入的类型

The type of quickCheck input

我正在尝试学习 QuickCheck 并了解它的工作原理。 quickCheck 函数的数据类型是

quickCheck :: Testable prop => prop -> IO ()

另一方面,我有一个函数

prop_rev_involutive:Eq a => [a] -> Bool
prop_rev_involutive l = (reverse $ reverse l) == l

我正在使用它作为 quickCheck 的输入。 运行 quickCheck prop_rev_involutive 工作正常,但我不明白类型是如何匹配的。

类型[a] -> Bool是否被认为是Testable?这是为什么?

Testable 类型 class - 本质上是对可以转化为自动化测试的事物的抽象。类型 class 有多个实例,其中之一是 Bool:

Testable Bool

不过,这不是 prop_rev_involutive 的类型。 Testable 的另一个实例是:

(Arbitrary a, Show a, Testable prop) => Testable (a -> prop)

这声明对于作为 ArbitraryShow 的实例的任何 a,从 aprop 的函数本身是 Testable。我们已经确定 BoolTestable 实例,所以现在您需要调查 [a] 是否是 ArbitraryShow 实例。

Arbitrary 类型 class 有大量实例,其中之一是:

Arbitrary a => Arbitrary [a]

这声明如果 a 是一个 Arbitrary 实例,那么 [a] 也是。那么,a 是一个 Arbitrary 实例吗?这取决于您实际 运行 quickCheck 使用哪种具体类型。某些 Haskell 环境默认为某些类型(例如 Int,其中 一个 Arbitrary 实例。

对于 Show 类型 class。

您需要进行相同的推理

我不认为任何不受约束的函数 [a] -> BoolTestable 实例,但像 (Arbitrary a, Show a) => [a] -> Bool 这样的东西是。示例包括 [Int] -> Bool[Char] -> Bool。这是因为 BoolTestable,而 IntChar 都是 ArbitraryShow 实例。