haskell-jp / questions #104 at 2023-07-23 20:34:25 +0900

callCCの型はなぜ`forall r m a. ((forall b. a -> ContT r m b) -> ContT r m a) -> ContT r m a`ではなく`forall r m a b. ((a -> ContT r m b) -> ContT r m a) -> ContT r m a`なのでしょうか
実際`callCC' f = callCC (\exit -> f $ (\ a -> absurd <$> exit a))`とすれば前者の型にでき、前者の型のほうが脱出用の継続(`callCC (\exit -> ...)`のexit)の返り値の型が制限されず便利であるように思えます
正解を知らないのですが高ランク多相を避けたかったんですかねえ
transformersパッケージはGHC拡張の使用に関して結構抑制的だった気がしますね
追記:mtlパッケージのcallCC関数がそういうアレになっている理由にはならないか