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