Hal*_*Ali 4 haskell quickcheck
我试图为身份编写一个 QuickCheck 测试
f $ y = f y
Run Code Online (Sandbox Code Playgroud)
我最初的计划是编写一个返回函数和整数的任意生成器,具有签名Gen (Int -> Int, Int)
并且在prop_DollerDoesNothing测试中,带/不带函数应用程序$给出相同的结果。
这是我的代码:
prop_DollarDoesNothing :: Property
prop_DollarDoesNothing =
forAll arbitraryFuncInt (\(f, y) -> (f $ y) == (f y))
arbitraryFuncInt :: Gen (Int -> Int, Int)
arbitraryFuncInt = do
f <- elements [(\x -> x*2), (\x -> x+3), (\x -> x-2)]
y <- arbitrary :: Gen Int
return (f, y)
Run Code Online (Sandbox Code Playgroud)
它生成了以下有用的错误消息:
* No instance for (Show (Int -> Int))
arising from a use of `forAll'
(maybe you haven't applied a function to enough arguments?)
* In the expression:
forAll arbitraryFuncInt (\ (f, y) -> (f $ y) == (f y))
In an equation for `prop_DollarDoesNothing':
prop_DollarDoesNothing
= forAll arbitraryFuncInt (\ (f, y) -> (f $ y) == (f y))
Run Code Online (Sandbox Code Playgroud)
因此,我修复了错误并通过应用任意函数并从返回一对整数来使测试工作arbitraryFuncInt
prop_DollarDoesNothing :: Property
prop_DollarDoesNothing =
forAll arbitraryFuncInt (\(x, y) -> x == y)
arbitraryFuncInt :: Gen (Int, Int)
arbitraryFuncInt = do
f <- elements [(\x -> x*2), (\x -> x+3), (\x -> x-2)]
y <- arbitrary :: Gen Int
return (f $ y, f y)
Run Code Online (Sandbox Code Playgroud)
我的问题是:
Show?Show (Int -> Int)实现# 1吗?f <- arbitrary :: Gen (Int -> Int)QuickCheck 支持使用Fun类型生成、收缩和显示函数。CoArbitrary启用函数的生成。然后将其转换为(可能是无限的)类似 trie 的结构,可以检查该结构并将其缩小到有限值(因为测试失败仅取决于有限多个输入),然后可以将其显示为反例。
具体来说,您可以将属性编写为带有参数的函数,这是使用我描述的机制的Fun包装器。(->)用模式解构它Fn以获得一个函数。
prop_dollarDoesNothing :: Property
prop_dollarDoesNothing = property $ \(Fn (f :: Int -> Int)) x ->
(f $ x) === f x
Run Code Online (Sandbox Code Playgroud)
了解更多信息
QuickCheck 实现:https://hackage.haskell.org/package/QuickCheck-2.11.3/docs/Test-QuickCheck-Function.html
Koen Claessen 的论文“收缩和展示功能”,似乎是付费墙,但他的演讲是在线的:https://www.youtube.com/watch ?v=CH8UQJiv9Q4
| 归档时间: |
|
| 查看次数: |
1567 次 |
| 最近记录: |