我目前正在处理一些我没有编写的 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
方法也可以解决问题。
有没有办法做到这一点?仅当 Show 实现不适用时,我可以强制 OverlappingInstances 使用默认实现吗?这是有保证的行为吗?
编辑:任何可以得到错误的人也可以打印类似堆栈跟踪的消息!