代码之家  ›  专栏  ›  技术社区  ›  Bas Bossink

使用QuickCheck生成int列表

  •  2
  • Bas Bossink  · 技术社区  · 16 年前

    我正在努力 Real World Haskell 其中之一 第4章的练习是执行 foldr 基于的版本 concat . 我认为这将是一个很好的测试 快速检查,因为有一个现有的实现来验证 结果。但是,这需要我定义 Arbitrary 可生成任意 [[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
    

    这导致没有进行任何测试。查看各种位和 碎片我猜 任意的 需要实例声明,并且 补充

        instance Arbitrary a => Arbitrary [[a]] where
        arbitrary = sized arb' 
            where arb' n = vector n (arbitrary :: Gen a)
    

    这导致GHCI抱怨我的实例声明 无效,添加-xflexibleinstances可能会解决我的问题。 添加 {-# OPTIONS_GHC -XFlexibleInstances #-} 指令 导致类型不匹配和重叠实例警告。

    所以我的问题是,要使这项工作成功需要什么?我显然是新来的 对哈斯克尔来说,我找不到任何帮助我的资源。 任何指点都非常感谢。

    编辑

    在第一次测试时,我似乎被QuickCheck的输出误导了。 fconcat 定义为

    fconcat = undefined  
    

    实际上,正确地实现该函数确实给出了预期的结果。 多普 你说什么?

    1 回复  |  直到 12 年前
        1
  •  3
  •   dave4420    16 年前

    [[Int]] 已经是 Arbitrary 实例(因为 Int 是一个 任意的 实例,所以 [a] 为了所有 a 它们本身就是 任意的 )所以这不是问题所在。

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