Haskellでの設計、ってみんなどうやってるんだろう?

自分は
対象の問題領域を大まかに定めて、
・その問題を表現できる操作群を考える
・その操作群において閉じている代数的データ型Hogeを作る
・操作が満たすべきルール、Hoge則を考える
パフォーマンスが低いなって思ったら、Hoge則を外れないように、Hoge型の定義と操作の定義を修正する。

あるいは、
対象の問題領域を別の問題領域に帰着させる。リストとか、ツリーとか。グラフとか。
んで、がんばって糊を作る。