IOモナドの扱い
IOをなるべく直接使わず型クラスを使う
IOモナドはプリミティブすぎます。
他のモナド変換子などと一緒に取り扱うのが不便です。
呼び出すたびにliftIOを使うのは面倒です。
なのでアクションを定義するときは出来る限りIOを直接使うのではなく、
MonadIOや、
MonadUnliftIOといった、
型クラスで抽象化するべきです。
MonadIOの方がより一般的なので、
先にそちらで定義出来ないか検討するべきです。
MonadUnliftIOの定義では、
class MonadIO m => MonadUnliftIO (m :: Type -> T
[Description truncada. Veja o README completo no GitHub.]