俺は、デバッグの時は、QuickCheck で怪しい関数を特定したら、
あとはチラシの裏にでも手で簡約してみる。

これを効率よくやるために、可能な限り徹底的に純粋関数で計算する。
例えば、do の中で IO 入力があれば、入力された値をそこでゴニョゴニョせず、直ちに純粋関数に渡す。
たとえ超単純な計算でも、純粋関数に渡すクセをつけておく。

do の中でゴニョゴニョした方がソースコードの見通しが良いのなら、
バグが無いと確信できたあとでリファクタリングすればいい。

あと、デバッグが無いと確信できるまでは、関数内関数も使わない。
局所的にしか使わないちょっとした関数も全部トップに書く。