¿Cómo anula las instancias de clase de tipo Haskell proporcionadas por el código del paquete?
Tengo un código antiguo de Haskell que incluye casos de prueba QuickCheck. Las versiones más recientes de QuickCheck (que acabo de actualizar a 2.4.0.1) incluyen instancias de clase de tipo paraArbitrary Word8
y otros. Estos no existían en versiones anteriores 2.0.x de Test.QuickCheck.Arbitrary.
Mientras útil en el sentido general, el paquete proporcionadoArbitrary Word8
generador no es el que quiero usar para mi conjunto de pruebas:
instance Arbitrary Word8 where
arbitrary = frequency [(2, oneof [return ctrlFrameDelim, return ctrlEscape, return ctrlXon, return ctrlXoff]),
(8, choose (0, 255))]
El código anterior provoca un error de declaración de instancia duplicada en tiempo de compilación. Puedo sacar este código y seguir adelante con el generador predeterminado, pero me gustaría saber la forma correcta de resolver esto.
Una posible solución que he considerado (pero no probado) es el aliasWord8
utilizandonewtype
. Eso provocaría muchos cambios en toda la fuente, así que espero que haya una forma más limpia.
EDIT: Como se menciona en los comentarios a continuación, la respuesta aceptada fue muy limpia y 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))]