使用QuickCheck生成Int列表

时间:2009-11-06 22:03:33

标签: quickcheck haskell

我正在通过Real World Haskell其中一个 第4章的练习是实现基于foldr的版本 concat。我认为这将是一个很好的测试用户 QuickCheck,因为有一个现有的实现来验证我的 结果。然而,这要求我定义一个实例 可以生成任意Arbitrary的{​​{1}}类型类。到目前为止我有 一直无法弄清楚如何做到这一点。我的第一次尝试是:

[[Int]]

这导致不执行任何测试。看着各种各样的东西 我猜想需要一个module FoldExcercises_Test where import Test.QuickCheck import Test.QuickCheck.Batch import FoldExcercises prop_concat xs = concat xs == fconcat xs where types = xs ::[[Int]] options = TestOptions { no_of_tests = 200 , length_of_tests = 1 , debug_tests = True } allChecks = [ run (prop_concat) ] main = do runTests "simple" options allChecks 实例声明 加入

Arbitrary

这导致ghci抱怨我的实例声明是 无效,并且添加-XFlexibleInstances可能会解决我的问题。 添加 instance Arbitrary a => Arbitrary [[a]] where arbitrary = sized arb' where arb' n = vector n (arbitrary :: Gen a) 指令 导致类型不匹配和重叠实例警告。

所以我的问题是让这项工作需要什么?我显然很新 到Haskell并没有找到任何帮助我的资源。 任何指针都非常感激。

修改

在测试第一种方式{-# OPTIONS_GHC -XFlexibleInstances #-}定义为

时,看起来我被QuickCheck的输出误导了
fconcat

实际上正确地实现该功能确实给出了预期的结果。的 DOOP

1 个答案:

答案 0 :(得分:3)

[[Int]]已经是Arbitrary个实例(因为IntArbitrary个实例,所有[a]的{​​{1}}实例都是a它们本身是Arbitrary)的实例。所以这不是问题。

我自己运行了你的代码(将import FoldExcercises替换为fconcat = concat),并按照我的预期进行了200次测试,所以我对为什么它没有为你做这件事感到困惑。但是您不需要添加Arbitrary实例。