我正在重构一些旧代码,这些代码是多态但类型类受限的 monad:
class ( MonadIO m
, MonadLogger m
, MonadLoggerIO m
, MonadThrow m
, MonadCatch m
, MonadMask m
, MonadBaseControl IO m
, MonadUnliftIO) => HasLogging m where
在旧代码中,应用程序的主要 monad 是......
type AppM = ReaderT Env IO
...现在将更改为...
newtype AppM (features :: [FeatureFlag]) a = AppM (ReaderT Env IO a)
deriving (Functor, Applicative, Monad, MonadReader Env, MonadIO)
在这种情况下,自动导出以下内容是否安全:
- 单子投掷
- 莫纳德捕获
- 单子掩码
- MonadBaseControl 类
- MonadUliftIO
在不深入 GHC 内部的情况下,当编译器自动派生事物时,培养对实际发生情况的直觉的最佳方法是什么?