我正在研究Real World Haskell第 4 章的练习之一是实现一个foldr
基于版本的
concat
. 我认为这将是使用 QuickCheck 进行测试的绝佳候选者,因为有一个现有的实现来验证我的结果。然而,这需要我定义一个
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
这导致不执行任何测试。看着各种点点滴滴,我猜想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
当在测试优先方式中定义 为时,我似乎被 QuickCheck 的输出误导了
fconcat = undefined
实际正确实现该功能确实给出了预期的结果。糟糕!