良くも悪くも、Haskell の人気のあるServantライブラリにより、 を含むモナド変換子スタックでコードを実行することが一般的になりましたExceptT err IO
。サーバント自身のハンドラーモナドはExceptT ServantErr IO
. 多くの人が主張するように、展開に失敗するには複数の方法があるため、これは動作するのがやや面倒なモナドです: 1) ベースからの通常の例外を介して、または 2) を返す。IO
Left
Ed Kmett のexceptions
ライブラリが役立つように次のように説明しています。
継続ベースのモナド、および
ErrorT e IO
複数の失敗モードを提供するようなスタックは、この [MonadMask
] クラスの無効なインスタンスです。
これは、リソース管理を行うための便利な [のポリモーフィック バージョン] 関数にMonadMask
アクセスできるため、非常に不便です (例外などによるリソースのリークはありません)。bracket
しかし、サーバントのHandler
モナドでは使えません。
私はあまり詳しくありませんが、解決策はmonad-control
多くのパートナーライブラリを使用することでありlifted-base
、lifted-async
モナドに次のようなリソース管理ツールへのアクセスを許可することであると言う人もいますbracket
(おそらくこれはExceptT err IO
友人にも機能しますか?)。
しかし、それはコミュニティで支持を失ってmonad-control
いるようですが、代替案が何であるかはわかりません. Snoyman の最近のライブラリでさえ、Kmett のライブラリを使用し、.safe-exceptions
exceptions
monad-control
Haskell を真剣に使用しようとしている私のような人々のために、誰かが現在の話を明確にすることができますか?