标签: quickcheck

使用Haskell的QuickCheck生成特定长度的列表

-- 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运行时,它会放弃,因为它不会生成足够长的列表.

如何编写生成长度超过随机整数的列表的生成器?

haskell quickcheck

14
推荐指数
2
解决办法
4913
查看次数

找到快速检查失败的值

当一个值未通过QuickCheck测试时,我想用它进行调试.有什么方法可以做我喜欢的事情:

let failValue = quickCheck' myTest
in someStuff failValue
Run Code Online (Sandbox Code Playgroud)

如果我的数据read能够,那么我可能会破解某种方式从IO中获取它,但事实并非如此.

haskell quickcheck

14
推荐指数
1
解决办法
723
查看次数

如何使用QuickCheck测试高阶函数?

我有一个我要测试的高阶函数,我要测试的一个属性就是它传入的函数.为了说明的目的,这是一个人为的例子:

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 quickcheck

14
推荐指数
1
解决办法
1306
查看次数

快速检查:如何使用穷举检查器来防止总和类型的被遗忘的构造函数

我有一个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)

haskell quickcheck

14
推荐指数
1
解决办法
303
查看次数

通过生成素数来使用QuickCheck

背景

为了好玩,我正在尝试编写一个用于快速检查的属性,可以使用RSA测试加密技术背后的基本思想.

  • 选择两个不同的素数,pq.
  • N = p*q
  • e是一些相对素数(p-1)(q-1)(在实践中,e通常是3用于快速编码)
  • d模数e模数(p-1)(q-1)

对于所有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)

haskell rsa properties generator quickcheck

13
推荐指数
1
解决办法
907
查看次数

这种幂等概括的名称是什么?

许多常用的函数属性都有简洁的名称.例如,关联性,交换性,传递性等.

我正在创建一个与QuickCheck一起使用的库,它提供了这些属性和其他属性的简写定义.

我有一个问题的是一元函数的幂等性.函数f是幂等的iif∀x.fx == f(fx).

这个属性有一个有趣的概括,我正在努力寻找一个类似的简洁名称.为了避免通过建议选择偏向于人们的姓名选择,我将其命名为P并提供以下定义:

函数f具有关于giif∀x的P属性.fx == f(gx).我们可以通过用P来重新定义幂等性来看待这是幂等性的概括.函数f是幂等的,如果它具有关于它自身的P属性.

要看到这是一个有用的属性,请注意它可以证明可以用来实现许多常见优化的重写规则.当g是某种规范化函数时,这通常但不总是出现.一些例子:

你会怎么称呼这家酒店?

optimization haskell naming quickcheck

13
推荐指数
1
解决办法
310
查看次数

haskell - 使用QuickCheck的平均浮点错误

我使用QuickCheck-2.5.1.1进行QA.我测试两个纯函数gold :: a -> Floatf :: 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)

haskell qa mean quickcheck standard-deviation

13
推荐指数
1
解决办法
563
查看次数

为什么HsColour二进制文件的存在/不存在会重新编译QuickCheck库?

假设我没有安装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也会重新编译

  1. 我安装了HsColour,
  2. 我安装了QuickCheck,
  3. 我删除了HsColour二进制文件和
  4. 我安装了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) .

haskell quickcheck cabal cabal-install

13
推荐指数
1
解决办法
295
查看次数

为什么我的SVG弧转换实现不能通过QuickCheck?

我实现了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)

svg haskell ieee-754 quickcheck

13
推荐指数
1
解决办法
236
查看次数

在QuickCheck中缩小记录的惯用法

假设我有一个记录类型:

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 quickcheck

12
推荐指数
2
解决办法
734
查看次数