我工作过的第4章的 练习Real World Haskell一个是落实 concat
的foldr
基于版本。我认为这将是一个很好的候选人用于测试 快速检查,因为有一个现有的实施来验证我的 结果。然而,这需要我定义可以生成任意[[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!
我同意。这在OSX Leopard的ghc 6.10.4中适用于我 – barkmadley 2009-11-06 23:56:01