Subscribed unsubscribe Subscribe Subscribe

Debug.Traceで関数の引数を表示するイディオム

haskell

Haskellでよくある複数行の関数定義だったり、ガードを使っている場合、全ての場合について引数をtraceするコードが書きにくいことがある。例えば、

data A = A1 | ...
data B = B1 | ...
data C = C1 | ...

f :: A -> B -> C -> ...
f A1 b c = ...
f a B1 c = ...
f a b C1 = ...

こんな定義でaとbとcをどの場合についてもtraceしたい場合、各行にそれぞれtraceを書く必要がありそうに見える。

f :: A -> B -> C -> ...
f A1 b c = traceShow (A1, b, c) $ ...
f a B1 c = traceShow (a, B1, c) $ ...
f a b C1 = traceShow (a, b, C1) $ ...

そういう場合はこうすると良いらしい。

f :: A -> B -> C -> ...
f a b c | traceShow (a, b, c) False = undefined
f A1 b c = ...
f a B1 c = ...
f a b C1 = ...

Debugging - HaskellWiki