haskell-jp / questions #101 at 2022-06-30 01:56:19 +0900

このツイートに書いたことなんですが、例えば
foo :: a -> IO ()

という foo があって、デバッグのために foo の中で
Debug.Trace.traceIO $ show a

をしたいとき、正攻法だと Show a 制約を付けて回るところを型をいじらずに済ます邪法はありますか?
Show a が存在しないケースでは実行時エラーで構いません
recover-rttiの使い所ですかね。型に固有のShowインスタンスを使うわけではありませんが https://hackage.haskell.org/package/recover-rtti-0.4.1.0/docs/Debug-RecoverRTTI.html#v:anythingToString
多分 anythingToString の方がいいとは思いますが、 CPPとConstrintKindsを組み合わせて
#if DEBUG
type ShowWhenDebug = Show
#else
type ShowEhenDebug _a = ()
#endif

という手が使えるかも知れません。(試してはいない。後恐らくHaddockに載る内容に軽いノイズが入る)
recover-rtti 忘れてましたね
試してみます!