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)
这声明对于作为 Arbitrary
和 Show
的实例的任何 a
,从 a
到 prop
的函数本身是 Testable
。我们已经确定 Bool
是 Testable
实例,所以现在您需要调查 [a]
是否是 Arbitrary
和 Show
实例。
Arbitrary
类型 class 有大量实例,其中之一是:
Arbitrary a => Arbitrary [a]
这声明如果 a
是一个 Arbitrary
实例,那么 [a]
也是。那么,a
是一个 Arbitrary
实例吗?这取决于您实际 运行 quickCheck
使用哪种具体类型。某些 Haskell 环境默认为某些类型(例如 Int
,其中 是 一个 Arbitrary
实例。
对于 Show
类型 class。
您需要进行相同的推理
我不认为任何不受约束的函数 [a] -> Bool
是 Testable
实例,但像 (Arbitrary a, Show a) => [a] -> Bool
这样的东西是。示例包括 [Int] -> Bool
和 [Char] -> Bool
。这是因为 Bool
是 Testable
,而 Int
和 Char
都是 Arbitrary
和 Show
实例。
我正在尝试学习 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)
这声明对于作为 Arbitrary
和 Show
的实例的任何 a
,从 a
到 prop
的函数本身是 Testable
。我们已经确定 Bool
是 Testable
实例,所以现在您需要调查 [a]
是否是 Arbitrary
和 Show
实例。
Arbitrary
类型 class 有大量实例,其中之一是:
Arbitrary a => Arbitrary [a]
这声明如果 a
是一个 Arbitrary
实例,那么 [a]
也是。那么,a
是一个 Arbitrary
实例吗?这取决于您实际 运行 quickCheck
使用哪种具体类型。某些 Haskell 环境默认为某些类型(例如 Int
,其中 是 一个 Arbitrary
实例。
对于 Show
类型 class。
我不认为任何不受约束的函数 [a] -> Bool
是 Testable
实例,但像 (Arbitrary a, Show a) => [a] -> Bool
这样的东西是。示例包括 [Int] -> Bool
和 [Char] -> Bool
。这是因为 Bool
是 Testable
,而 Int
和 Char
都是 Arbitrary
和 Show
实例。