15

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))]
4

1 に答える 1

13

ここnewtypeでは、エイリアスが標準ソリューションです。ほとんどの場合、あなたのものが含まれていない可能性がありますが、newtypeラッパーは、任意の型クラスを使用する場所にのみ表示される必要があるため、これは大したことではありません。たとえば、トップレベルに次のようなものがあります。

x <- arbitrary

そして代わりにあなたは持っているでしょう

newtype SomeNewType = SNT Word8
instance Arbitrary SomeNewType where ...
....
    SNT x <- arbitrary

おそらく必要なものはGHC拡張機能として存在しません。インスタンスの明示的なインポートとエクスポートが必要です。明示的なインスタンスのインポートがある場合、これにより次のことが可能になります。

import Test.QuickCheck hiding (Arbitrary(Word8))

しかし、インスタンスの暗黙的なインポートによって現在機能している多くのコードを壊してください。

import Test.QuickCheck (quickCheck) -- note the implicit import of Arbitrary(..)
于 2011-04-13T01:20:38.380 に答える