私は現在、私が書いたのではなく、変更を加えたいくつかの 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 にデフォルトの実装を使用させることはできますか? これは保証された動作ですか?
編集:エラーを取得してスタックトレースのようなメッセージを出力できる人にはボーナスポイント!