это работало отлично. Как оказалось, псевдоним не требовал никаких каскадных изменений. Мне просто нужно было предоставить еще одно объявление «instance Random SomeNewType» для «select».

я есть старый код на Haskell, включающий тестовые примеры QuickCheck. Более новые версии 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))]

Приведенный выше код вызывает ошибку объявления экземпляра во время компиляции. Я могу взять этот код и поработать с генератором по умолчанию, но я хотел бы знать правильный способ решить эту проблему.

Одно из возможных решений, которое я рассматривал (но не тестировал), - это алиасингWord8 с помощьюnewtype, Это повлечет за собой множество изменений во всем источнике, поэтому я надеюсь, что есть более чистый путь.

РЕДАКТИРОВАТЬ: Как упоминалось в комментариях ниже, принятый ответ был очень четким и простым в реализации:

newtype EncodedByte = EncodedByte Word8

instance Arbitrary EncodedByte where
  arbitrary = liftM EncodedByte $ frequency [(2, elements [ctrlFrameDelim, ctrlEscape, ctrlXon, ctrlXoff]),
                                             (8, choose (0, 255))]

Ответы на вопрос(1)

Ваш ответ на вопрос