Haskell 快速检查输入的类型

Haskell 快速检查输入的类型,haskell,quickcheck,Haskell,Quickcheck,我正在努力学习快速检查并了解它是如何工作的。quickCheck函数的数据类型为 quickCheck :: Testable prop => prop -> IO () 另一方面,我有一个函数 prop_rev_involutive:Eq a => [a] -> Bool prop_rev_involutive l = (reverse $ reverse l) == l 用于快速检查的输入。运行quickCheck prop\u rev\u对合 工作正常,但我不明

我正在努力学习快速检查并了解它是如何工作的。quickCheck函数的数据类型为

quickCheck :: Testable prop => prop -> IO ()
另一方面,我有一个函数

prop_rev_involutive:Eq a => [a] -> Bool
prop_rev_involutive l = (reverse $ reverse l) == l
用于快速检查的输入。运行
quickCheck prop\u rev\u对合
工作正常,但我不明白类型是如何匹配的


类型
[a]->Bool
是否被认为是可测试的?这是为什么?

可测试的是一个类型类,本质上是对可以转化为自动测试的事物的抽象。type类有几个实例,其中一个是
Bool

Testable Bool
不过,这不是
prop\u rev\u对合的类型。
Testable
的另一个实例是:

(Arbitrary a, Show a, Testable prop) => Testable (a -> prop)
这表明,对于作为
任意
显示
实例的任何
a
,从
a
prop
的函数本身是可测试的。我们已经确定
Bool
是一个
可测试的
实例,所以现在需要调查
[a]
是否是一个
任意的
显示
实例

任意
类型类有大量实例,其中之一是:

Arbitrary a => Arbitrary [a]
这表明,如果
a
是一个
任意的
实例,那么
[a]
也是如此。那么,
是一个
任意的
实例吗?这取决于实际运行
quickCheck
的具体类型。某些Haskell环境默认为某些类型(例如,
Int
,这是一个
任意的
实例)

对于
Show
type类,您需要进行同样的推理


我不认为任何无约束函数
[a]->Bool
是一个
可测试的
实例,但类似
(任意a,显示a)=>[a]->Bool
的东西是。示例包括
[Int]->Bool
[Char]->Bool
。这是因为
Bool
可测试的
Int
Char
都是
任意的
Show
实例。

提示:查看实例以了解更多信息。另外,请记住考虑类型默认设置。