10
我目前正在處理一些我沒有寫的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
方法也做的伎倆。
有沒有辦法做到這一點?只有當Show實現不適用時,我才能強制OverlappingInstances使用默認實現嗎?這是保證行爲嗎?
編輯:獎勵積分的人誰可以得到錯誤同時打印一個堆棧跟蹤般的消息!
這非常好,肯定是 「真實世界」回答。但我仍然喜歡看看是否有辦法獲得我正在談論的實例行爲。 – jmite