-- 3 (find k"th element of a list)
element_at xs x = xs !! x
prop_3a xs x = (x < length xs && x >= 0) ==> element_at xs (x::Int) == (xs !! x::Int)
Run Code Online (Sandbox Code Playgroud)
当prop_3a通过QuickCheck运行时,它会放弃,因为它不会生成足够长的列表.
如何编写生成长度超过随机整数的列表的生成器?
当一个值未通过QuickCheck测试时,我想用它进行调试.有什么方法可以做我喜欢的事情:
let failValue = quickCheck' myTest
in someStuff failValue
Run Code Online (Sandbox Code Playgroud)
如果我的数据read能够,那么我可能会破解某种方式从IO中获取它,但事实并非如此.
我有一个我要测试的高阶函数,我要测试的一个属性就是它传入的函数.为了说明的目的,这是一个人为的例子:
gen :: a -> ([a] -> [a]) -> ([a] -> Bool) -> a
Run Code Online (Sandbox Code Playgroud)
这个想法大致是这是一个示例生成器.我将从一个单一开始a,创建单个列表[a],然后创建新的列表,[a]直到谓词告诉我停止.呼叫可能如下所示:
gen init next stop
Run Code Online (Sandbox Code Playgroud)
哪里
init :: a
next :: [a] -> [a]
stop :: [a] -> Bool
Run Code Online (Sandbox Code Playgroud)
这是我要测试的属性:
在任何调用中
gen init next stop,genpromises永远不会传递空列表next.
我可以使用QuickCheck测试此属性吗?如果是,如何测试?
我有一个Haskell数据类型
data Mytype
= C1
| C2 Char
| C3 Int String
Run Code Online (Sandbox Code Playgroud)
如果我case在a Mytype并忘记处理其中一个案例,GHC会给我一个警告(详尽检查).
我现在想编写一个QuickCheck Arbitrary实例来生成MyTypes如下:
instance Arbitrary Mytype where
arbitrary = do
n <- choose (1, 3 :: Int)
case n of
1 -> C1
2 -> C2 <$> arbitrary
3 -> C3 <$> arbitrary <*> someCustomGen
Run Code Online (Sandbox Code Playgroud)
这个问题是我可以添加一个新的替代方案Mytype并忘记更新Arbitrary实例,因此让我的测试不测试该替代方案.
我想找到一种方法来使用GHC的详尽检查器来提醒我在我的任意实例中被遗忘的案例.
我想出的最好的是
arbitrary = do
x <- elements [C1, C2 undefined, C3 undefined undefined]
case x of
C1 -> C1
C2 …Run Code Online (Sandbox Code Playgroud) 背景
为了好玩,我正在尝试编写一个用于快速检查的属性,可以使用RSA测试加密技术背后的基本思想.
对于所有x这些,1 < x < N总是如此(x^e)^d = x modulo N
换句话说,x是"消息",将其提升到e功率mod N是"编码"消息的行为,并且将编码消息提升到d功率mod N是"解码"它的行为.
(该属性也非常简单x = 1,一个是自己加密的情况)
码
以下是我到目前为止编写的方法:
import Test.QuickCheck
-- modular exponentiation
modExp :: Integral a => a -> a -> a -> a
modExp y …Run Code Online (Sandbox Code Playgroud) 许多常用的函数属性都有简洁的名称.例如,关联性,交换性,传递性等.
我正在创建一个与QuickCheck一起使用的库,它提供了这些属性和其他属性的简写定义.
我有一个问题的是一元函数的幂等性.函数f是幂等的iif∀x.fx == f(fx).
这个属性有一个有趣的概括,我正在努力寻找一个类似的简洁名称.为了避免通过建议选择偏向于人们的姓名选择,我将其命名为P并提供以下定义:
函数f具有关于giif∀x的P属性.fx == f(gx).我们可以通过用P来重新定义幂等性来看待这是幂等性的概括.函数f是幂等的,如果它具有关于它自身的P属性.
要看到这是一个有用的属性,请注意它可以证明可以用来实现许多常见优化的重写规则.当g是某种规范化函数时,这通常但不总是出现.一些例子:
length相对于P (对于f的所有选择)map fminimum是关于小块的 P.你会怎么称呼这家酒店?
我使用QuickCheck-2.5.1.1进行QA.我测试两个纯函数gold :: a -> Float
和f :: a -> Float,其中a实例随心所欲.
这gold是参考计算,f是我正在优化的变体.
到目前为止,我使用quickcheck的大多数测试都使用了类似的测试\a -> abs (gold a - f a) < 0.0001.
但是,我想收集统计数据并检查阈值,因为知道平均误差和标准偏差对指导我的设计很有用.
有没有办法使用QuickCheck来收集这样的统计数据?
为了给出我正在寻找的那种东西的具体例子,假设我有以下两个函数来近似平方根:
-- Heron's method
heron :: Float -> Float
heron x = heron' 5 1
where
heron' n est
| n > 0 = heron' (n-1) $ (est + (x/est)) / 2
| otherwise = est
-- Fifth order Maclaurin series expansion
maclaurin :: Float …Run Code Online (Sandbox Code Playgroud) 假设我没有安装HsColour程序,我安装了QuickCheck
$ cd /tmp/
$ cabal get QuickCheck
$ cd QuickCheck
$ cabal install
...
[ 1 of 15] Compiling Test.QuickCheck.Random
...
[15 of 15] Compiling Test.QuickCheck
...
Installed QuickCheck-2.7.6
Run Code Online (Sandbox Code Playgroud)
如果我再次安装QuickCheck,则不会重新编译,也就是说,我没有看到这些行
[ 1 of 15] Compiling Test.QuickCheck.Random
...
[15 of 15] Compiling Test.QuickCheck
Run Code Online (Sandbox Code Playgroud)
但如果我安装HsColour当前版本(1.20.3)并再次安装QuickCheck,则会重新编译QuickCheck.
如果,QuickCheck也会重新编译
我用GHC 7.8.3,Cabal 1.20.0.2和cabal-install 1.20.0.3测试了这种行为,以及Cabal和cabal-install的开发版本(使用https://github.com/haskell/cabal/commit/5ef7d84bb25cc5d53ad124978922f2c96bedb7d4) .
我实现了W3s推荐的算法,用于将SVG路径弧从端点弧转换为中心弧并返回 Haskell.
type EndpointArc = ( Double, Double, Double, Double
, Bool, Bool, Double, Double, Double )
type CenterArc = ( Double, Double, Double, Double
, Double, Double, Double )
endpointToCenter :: EndpointArc -> CenterArc
centerToEndpoint :: CenterArc -> EndpointArc
Run Code Online (Sandbox Code Playgroud)
但我无法通过这个属性:
import Test.QuickCheck
import Data.AEq ((~==))
instance Arbitrary EndpointArc where
arbitrary = do
((x1,y1),(x2,y2)) <- arbitrary `suchThat` (\(u,v) -> u /= v)
rx <- arbitrary `suchThat` (>0)
ry <- arbitrary `suchThat` (>0)
phi <- choose (0,2*pi)
(fA,fS) …Run Code Online (Sandbox Code Playgroud) 假设我有一个记录类型:
data Foo = Foo {x, y, z :: Integer}
Run Code Online (Sandbox Code Playgroud)
编写Arbitrary实例的一种巧妙方法是使用Control.Applicative,如下所示:
instance Arbitrary Foo where
arbitrary = Foo <$> arbitrary <*> arbitrary <*> arbitrary
shrink f = Foo <$> shrink (x f) <*> shrink (y f) <*> shrink (z f)
Run Code Online (Sandbox Code Playgroud)
因此,Foo的收缩列表是其成员所有收缩的笛卡尔积.
但是如果其中一个收缩返回[]那么整个Foo就不会收缩.所以这不起作用.
我可以尝试通过在缩小列表中包含原始值来保存它:
shrink f = Foo <$> ((x f) : shrink (x f)) <*> ... {and so on}.
Run Code Online (Sandbox Code Playgroud)
但现在缩小(Foo 0 0 0)将返回[Foo 0 0 0],这意味着收缩将永远不会终止.所以这也不起作用.
看起来在这里应该使用<*>以外的其他东西,但我看不出是什么.
haskell ×10
quickcheck ×10
cabal ×1
generator ×1
ieee-754 ×1
mean ×1
naming ×1
optimization ×1
properties ×1
qa ×1
rsa ×1
svg ×1