EitherT の代わりに ErrorT に変更

EitherT の代わりに ErrorT を使うように変更してみました。
これで transaction 関数が大分すっきりしました。
本件の Either は単なる左/右なだけでなく、
左はエラー値を表しているので、意味から考えても ErrorT の方が適切でしょう。

ErrorT の場合 Left に利用できるのが Error クラスのインスタンスである必要があるので
むりやり instance Error ByteString していますが、
警告 ON でコンパイルすると orphan instance といわれます。
これが気になるようなら、

* エラーメッセージには String を利用し、apply で pack する。
  (String はデフォルトで Error クラスのインスタンスらしいので)
* 真面目に HogeException とか HogeError とか型を定義する

のいずれかかと思います。
真面目に型を定義した方が Haskell ちっくだとは思いますが、
今回の場合このエラーを見るのは他のプログラムではなくユーザなので、
ライブラリとして他のプログラムに組み込まれるならともかく、
現時点では String で十分な気はしますね。

ともあれこれで、EnvWithError 環境下に居る限りいつでも throwError で処理を中断でき、
runErrorT でさくっと Left 値として取り出せるようになったわけです。
こうすっきり書けるのを見てるとなんか C# やら Java やらの try-catch って
何だったんだろうって気がしてきますね…。