Attualmente mi sto occupando di un codice Haskell che non ho scritto, ma di cui ho apportato delle modifiche. Dopo le mie modifiche, corro il programma e ottenere il seguente messaggio di errore:Posso usare OverlappingInstances per ottenere messaggi di errore più gradevoli?
Prelude.!!: index too large
La chiamata a !!
non è nel mio codice, quindi refactoring via è più lavoro che voglio fare, se posso evitarlo .
Quello che mi piacerebbe è quello di fare qualcosa di simile:
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.!!
vale a dire la funzione !!
è definita per ogni possibile tipo di lista, ma si comporta in modo diverso ogni volta che un Visualizza istanza viene definito per il tipo di elemento.
In alternativa, un metodo tryShow :: a -> Maybe String
farebbe anche il trucco.
C'è un modo per farlo? Posso forzare OverlappingInstances a utilizzare l'implementazione predefinita solo quando l'implementazione Show non si applica? Questo comportamento è garantito?
MODIFICA: punti bonus per chiunque riesca a ottenere l'errore anche per stampare un messaggio simile a una traccia stack!
Questo è stato eccellente, ed è sicuramente il "mondo reale" risposta. Ma mi piacerebbe comunque vedere se c'è un modo per ottenere il comportamento delle istanze di cui sto parlando. – jmite