我正在努力
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
实际上,正确地实现该函数确实给出了预期的结果。
多普
你说什么?