Ich beschäftige mich derzeit mit Haskell Code, den ich nicht geschrieben habe, aber an dem ich Änderungen vorgenommen habe. Nach meinen Änderungen, betreiben ich das Programm und die folgende Fehlermeldung:Kann ich OverlappingInstances verwenden, um bessere Fehlermeldungen zu erhalten?
Prelude.!!: index too large
Der Aufruf von !!
ist nicht in meinem Code, so dass es Refactoring weg ist mehr Arbeit, als ich tun möchte, wenn ich es vermeiden kann .
Was Ich mag würde, ist so etwas wie dies zu tun:
class PrintList a where
(!!) :: [a] -> Int -> a
instance (Show a) => PrintList a where
l (!!) n = if n < (length l)
then (l Prelude.!! n)
else error ("Index " ++ show n ++ " out of bounds in " ++ show l)
instance PrintList a where
(!!) = Prelude.!!
das heißt die Funktion !!
für jeden möglichen Listentyp definiert ist, aber es verhält sich anders, wenn eine Karte Instanz für den Elementtyp definiert ist.
Alternativ würde eine tryShow :: a -> Maybe String
Methode auch den Trick tun.
Gibt es eine Möglichkeit, dies zu tun? Kann ich OverlappingInstances zwingen, die Standardimplementierung nur zu verwenden, wenn die Show-Implementierung nicht zutrifft? Ist das garantiertes Verhalten?
BEARBEITEN: Bonuspunkte für alle, die den Fehler erhalten können, um auch eine Stack-Trace-ähnliche Nachricht zu drucken!
Dies war ausgezeichnet, und ist sicherlich die "reale Welt" Antworten. Aber ich würde immer noch gerne sehen, ob es einen Weg gibt, das Instanzenverhalten zu erreichen, von dem ich rede. – jmite