我正在通过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 #-}
定义为
fconcat
实际上正确地实现该功能确实给出了预期的结果。的 DOOP !
答案 0 :(得分:3)
[[Int]]
已经是Arbitrary
个实例(因为Int
是Arbitrary
个实例,所有[a]
的{{1}}实例都是a
它们本身是Arbitrary
)的实例。所以这不是问题。
我自己运行了你的代码(将import FoldExcercises
替换为fconcat = concat
),并按照我的预期进行了200次测试,所以我对为什么它没有为你做这件事感到困惑。但是您不需要添加Arbitrary
实例。