haskell-jp / questions #97 at 2021-05-13 13:33:04 +0900

exceptionsパッケージで`MonadCatch`クラスに`ContT` インスタンスが提供されていないのは何か理由があるのでしょうか?
具体的には実装として以下のものを考えられると思うのですがまずい部分があるのでしょうか?
instance MonadCatch m => MonadCatch (ContT r m) where
  catch m f = ContT $ \k -> catch (runContT m k) (flip runContT k . f)
その実装だと、mの本質的な処理を終え、継続(k)の部分で例外が発生したときに、ハンドラで再びその継続が呼ばれることになります。第一引数で発生した例外を受け止めるというcatchの本来の振る舞いから乖離してしまうため、そのような実装は意図的に除外されているものと認識しています(cf. https://github.com/ekmett/exceptions/blame/d0e7e68a465831887aacf656373cd795dddf7f0e/src/Control/Monad/Catch.hs#L719)。
なるほど…たしかにそうですね…
ありがとうございます:man-bowing: