2013-07-17 5 views
9

Ich definierte eine NumericPreludeRing Instanz für meinen eigenen Datentyp, konnte aber one oder fromInteger nicht definieren. Als ich das Programm kompilierte, bekam ich keine Warnungen, weil die Klasse Ring standardmäßig wechselseitig rekursive Implementierungen für one und fromInteger hat. Das Ergebnis: ein Stapelüberlauf, der sehr schwer zu finden war. (In der Tat, wenn -XRebindableSyntax verwenden, die fromInteger auf numerische Konstanten müssen nicht explizit sein, so dass es ziemlich schwierig war, um herauszufinden, fromInteger der Täter des Stapelüberlauf war.)Minimale vollständige Definition Anmerkungen für Haskell

Gibt es eine Möglichkeit für Entwickler Klassen mit Anmerkungen versehen zu eine minimale vollständige Definition angeben? Es wäre sehr hilfreich, wenn GHC eine Warnung für Instanzen ausgeben könnte, die diese Definition nicht erfüllen und gleichzeitig eine vollständige Reihe von Standardimplementierungen zulassen. Wenn nicht, was ist die akzeptierte Praxis hier? Sollten Entwickler die (a?) Minimale Menge von Methoden ohne Standardwerte belassen, damit die entsprechenden Warnungen ausgegeben werden, oder sind wir auf RTFM angewiesen?

Antwort

2

Die beiden Ansätze, die ich habe, sind im Grunde gesehen:

  1. die Standardwerte sorgen. Geben Sie die minimale vollständige Definition in der Dokumentation an (oft haben Sie Optionen; bei gegenseitig rekursiven Standardeinstellungen müssen Sie nur genügend Methoden implementieren, um die Rekursion zu brechen, aber Sie können beliebige auswählen, die Ihnen gefallen). Erwarten Sie Instance Writer, um die Dokumentation zu lesen.

  2. Geben Sie keine Standardwerte an, sondern Funktionen mit Namen wie defaultImplementationOfFoo. Dies zwingt den Instanz-Writer grundsätzlich dazu, explizit nach den Standardwerten zu fragen, ohne dass sie die Implementierung des Standards tatsächlich bereitstellen müssen. Aber sie müssen immer noch die Dokumentation lesen, um zu wissen, dass diese Funktionen existieren.