我有一些包含 QuickCheck 测试用例的旧 Haskell 代码。较新版本的 QuickCheck(我刚刚升级到 2.4.0.1)包括类型类实例 forArbitrary 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))]
上面的代码在编译时会导致重复的实例声明错误。我可以取出这段代码并使用默认生成器,但我想知道解决这个问题的正确方法。
我考虑过(但未经测试)的一种可能的解决方案是Word8
使用newtype
. 这会导致整个源代码发生许多变化,所以我希望有一种更清洁的方法。
编辑:正如下面的评论中提到的,接受的答案非常干净且易于实施:
newtype EncodedByte = EncodedByte Word8
instance Arbitrary EncodedByte where
arbitrary = liftM EncodedByte $ frequency [(2, elements [ctrlFrameDelim, ctrlEscape, ctrlXon, ctrlXoff]),
(8, choose (0, 255))]