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