QuickCheckテストケースを含む古いHaskellコードがいくつかあります。QuickCheckの新しいバージョン(2.4.0.1にアップグレードしたばかり)には、Arbitrary Word8
およびその他の型クラスインスタンスが含まれています。これらは、Test.QuickCheck.Arbitraryの古い2.0.xバージョンには存在しませんでした。
一般的な意味では便利ですが、パッケージで提供されるArbitrary Word8
ジェネレーターは、テストスイートで使用したいものではありません。
instance Arbitrary Word8 where
arbitrary = frequency [(2, oneof [return ctrlFrameDelim, return ctrlEscape, return ctrlXon, return ctrlXoff]),
(8, choose (0, 255))]
上記のコードは、コンパイル時に重複インスタンス宣言エラーを引き起こします。このコードを取り出してデフォルトのジェネレーターで処理することはできますが、これを解決する適切な方法を知りたいです。
私が検討した(ただしテストされていない)1つの可能な解決策は、Word8
を使用したエイリアシングnewtype
です。それはソース全体で多くの変更を引き起こすので、よりクリーンな方法があることを望んでいます。
編集:以下のコメントで述べられているように、受け入れられた答えは非常にクリーンで実装が簡単でした:
newtype EncodedByte = EncodedByte Word8
instance Arbitrary EncodedByte where
arbitrary = liftM EncodedByte $ frequency [(2, elements [ctrlFrameDelim, ctrlEscape, ctrlXon, ctrlXoff]),
(8, choose (0, 255))]