【发布时间】:2011-04-13 01:10:29
【问题描述】:
我有一些包含 QuickCheck 测试用例的旧 Haskell 代码。较新版本的 QuickCheck(我刚刚升级到 2.4.0.1)包括 Arbitrary Word8 和其他的类型类实例。这些在旧的 2.0.x 版本的 Test.QuickCheck.Arbitrary 中不存在。
虽然在一般意义上很有用,但包提供的 Arbitrary Word8 生成器并不是我想用于我的测试套件的那个:
instance Arbitrary Word8 where
arbitrary = frequency [(2, oneof [return ctrlFrameDelim, return ctrlEscape, return ctrlXon, return ctrlXoff]),
(8, choose (0, 255))]
以上代码在编译时导致重复实例声明错误。我可以取出这段代码并使用默认生成器,但我想知道解决这个问题的正确方法。
我考虑过(但未经测试)的一种可能的解决方案是使用 newtype 为 Word8 起别名。这会导致整个源代码发生许多变化,所以我希望有一种更清洁的方法。
编辑:正如下面的 cmets 所述,接受的答案非常干净且易于实施:
newtype EncodedByte = EncodedByte Word8
instance Arbitrary EncodedByte where
arbitrary = liftM EncodedByte $ frequency [(2, elements [ctrlFrameDelim, ctrlEscape, ctrlXon, ctrlXoff]),
(8, choose (0, 255))]
【问题讨论】:
标签: haskell quickcheck