2009-11-06 68 views
2

我工作过的第4章的 练习Real World Haskell一个是落实 concatfoldr基于版本。我认为这将是一个很好的候选人用于测试 快速检查,因为有一个现有的实施来验证我的 结果。然而,这需要我定义可以生成任意[[Int]]的类型类型的实例。到目前为止,我有 一直无法弄清楚如何做到这一点。我的第一个尝试是:正在执行生成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实例声明和 加入

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

这导致ghci中说我的实例声明是无效的 并添加-XFlexibleInstances可以解决我的问题。 添加{-# OPTIONS_GHC -XFlexibleInstances #-}指令 会导致类型不匹配和重叠实例警告。

所以我的问题是什么需要做这项工作?对于Haskell,我显然是新的 ,我没有找到任何帮助我的资源。 任何指针,非常感谢。

编辑

看来我被快速检查的输出误导时,在测试第一方式fconcat被定义为

fconcat = undefined 

实际执行函数正确确实给出了预期的结果。 DOOP

回答

3

[[Int]]已经是一个Arbitrary实例(因为IntArbitrary实例,因此是[a]所有a S中的自己Arbitrary实例)。所以这不是问题。

我自己运行你的代码(用fconcat = concat代替import FoldExcercises),它运行了200次测试,所以我很困惑它为什么不能为你做。但是您不需要添加Arbitrary实例。

+0

我同意。这在OSX Leopard的ghc 6.10.4中适用于我 – barkmadley 2009-11-06 23:56:01