Wie überschreiben Sie Haskell-Klasseninstanzen, die vom Paketcode bereitgestellt werden?

8

Ich habe einen alten Haskell-Code, der QuickCheck-Testfälle enthält. Neuere Versionen von QuickCheck (ich habe gerade auf 2.4.0.1 aktualisiert) enthalten Klassenklasseninstanzen für Arbitrary Word8 und andere. Diese waren in älteren 2.0.x-Versionen von Test.QuickCheck.Arbitrary nicht vorhanden.

Obwohl es im allgemeinen Sinne nützlich ist, ist der vom Paket bereitgestellte Generator Arbitrary Word8 nicht der, den ich für meine Testsuite verwenden möchte:

%Vor%

Der obige Code verursacht bei der Kompilierung einen doppelten Deklarationsfehler. Ich kann diesen Code herausnehmen und mit dem Standardgenerator auskommen, aber ich würde gerne wissen, wie man das lösen kann.

Eine mögliche Lösung, die ich in Betracht gezogen (aber nicht getestet) habe, ist Aliasing Word8 mit newtype . Das würde viele Änderungen in der Quelle verursachen, also hoffe ich, dass es einen saubereren Weg gibt.

EDIT: Wie in den Kommentaren unten erwähnt, war die angenommene Antwort sehr sauber und einfach zu implementieren:

%Vor%     
David Joyner 13.04.2011, 01:10
quelle

1 Antwort

8

A newtype alias ist hier die Standardlösung. In den meisten Fällen, in denen Sie möglicherweise nicht enthalten sind, ist dies keine große Sache, da der Wrapper für den neuen Typ nur dort angezeigt werden muss, wo Sie die Klasse Arbitrary verwenden. Zum Beispiel könnten Sie auf einer obersten Ebene haben:

%Vor%

Und stattdessen hättest du

%Vor%

Was Sie wahrscheinlich möchten, existiert nicht als GHC-Erweiterung - Sie möchten Instanzen explizit importieren und exportieren. Wenn Sie explizite Instanzimporte hatten, würde dies Folgendes ermöglichen:

%Vor%

Aber viel Code, der derzeit durch implizite Imports von Instanzen funktioniert, bricht:

%Vor%     
Thomas M. DuBuisson 13.04.2011, 01:20
quelle

Tags und Links