В настоящее время я имею дело с некоторым кодом Haskell, который я не писал, но что я внес изменения. После моих изменений я запустил программу и получил следующее сообщение об ошибке:
Prelude.!!: index too large
Вызов !!
не входит в мой код, поэтому рефакторинг его больше, чем я хочу, если я могу его избежать.
Я бы хотел сделать что-то вроде этого:
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.!!
то есть. функция !!
определяется для каждого возможного типа списка, но она ведет себя по-разному, если для типа элемента определен определенный экземпляр Show.
Альтернативно, метод tryShow :: a -> Maybe String
также выполнит трюк.
Есть ли способ сделать это? Могу ли я заставить OverlappingInstances использовать реализацию по умолчанию только тогда, когда реализация Show не применяется? Это гарантированное поведение?
EDIT: бонусные баллы для всех, кто может получить сообщение об ошибке, также распечатать сообщение, подобное трассировке.