例えばこのような型クラスとそのインスタンス型があるとします。

class ABC t where
 abc :: t -> IO Int

data X = 何か
instnce ABC X where
 abc x = 何か

アプリケーションの本番環境ではこれでいいのですが、
この型Xの値を使う環境の方をデバッグしたりテストする場合に問題が起きました。

abc関数をX型の値に適用したとき、戻り値を以前戻した値に基づいて計算したいとか、
適用する度に予め用意したリストから順に値を戻したいという場合があります。

例えば初めての適用なら5::IO Intを、2回目の適用なら13::IO Intを戻したいとか。
前回10::IO Intを戻したなら、今回はerror関数を使って例外を投げるとか。
状態を保存しないとできないことです。

このようなことが本番環境でも必要なら、ABC型クラスの定義を例えば下記のように変え、

class ABC t where
 abc :: t -> IO (Int, t)

X型の値の中に状態を保存するようにします(要はMap型などと同じやり方です)。

しかし、今回はデバッグやテストのためだけです。
そのためだけに全体のアーキテクチャを変えてしまうのは如何なものかとも思うのですが、
デバッグやテスト優先で変えるべきでしょうか。
それとも、関数を使用する側は変えなくても良い、
あるいは変えるとしても些細な修正ですむ方法があるでしょうか。