Como você substitui as instâncias de classe de tipo Haskell fornecidas pelo código do pacot
Tenho algum código Haskell antigo que inclui casos de teste do QuickCheck. As versões mais recentes do QuickCheck (que acabei de atualizar para 2.4.0.1) incluem instâncias de classe de tipo paraArbitrary Word8
e outros. Eles não existiam nas versões 2.0.x mais antigas do Test.QuickCheck.Arbitrary.
Embora útil no sentido geral, o pacote fornecidoArbitrary Word8
gerador não é o que eu quero usar para minha suíte de testes:
instance Arbitrary Word8 where
arbitrary = frequency [(2, oneof [return ctrlFrameDelim, return ctrlEscape, return ctrlXon, return ctrlXoff]),
(8, choose (0, 255))]
O código acima causa um erro de declaração de instância duplicada no tempo de compilação. Posso retirar esse código e seguir em frente com o gerador padrão, mas gostaria de saber a maneira correta de resolver iss
Uma possível solução que considerei (mas não testei) é aliasingWord8
usandonewtype
. Isso causaria muitas mudanças em toda a fonte, por isso espero que haja uma maneira mais limp
EDIT: Como mencionado nos comentários abaixo, a resposta aceita foi muito limpa e fácil de implementar:
newtype EncodedByte = EncodedByte Word8
instance Arbitrary EncodedByte where
arbitrary = liftM EncodedByte $ frequency [(2, elements [ctrlFrameDelim, ctrlEscape, ctrlXon, ctrlXoff]),
(8, choose (0, 255))]