我正在努力学习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吗?为什么会这样呢?
发布于 2020-03-04 06:45:09
Testable是一个类型类--本质上是对可以转换为自动化测试的事物的抽象。类型类有几个实例,其中一个实例是Bool
Testable Bool不过,这不是prop_rev_involutive的类型。Testable的另一个实例是:
(Arbitrary a, Show a, Testable prop) => Testable (a -> prop)这表明,对于任何a (它是Arbitrary和Show的实例),从a到prop的函数本身就是Testable。我们已经确定Bool是一个Testable实例,所以现在您需要研究[a]是否是Arbitrary和Show实例。
Arbitrary类型类有大量实例,其中之一是:
Arbitrary a => Arbitrary [a]这表明,如果a是Arbitrary实例,那么[a]也是。那么,a是一个Arbitrary实例吗?这取决于您实际使用哪种具体类型运行quickCheck。某些Haskell环境默认为某些类型(例如,Int,它是Arbitrary实例)。
您需要对Show类型类进行同样的推理。
我不认为任何无约束函数[a] -> Bool都是Testable实例,而是类似于(Arbitrary a, Show a) => [a] -> Bool的实例。例子包括[Int] -> Bool和[Char] -> Bool。这是因为Bool是Testable,Int和Char都是Arbitrary和Show实例。
https://stackoverflow.com/questions/60519068
复制相似问题