派生 MonadThrow、MonadCatch、MonadBaseControl、MonadUnliftIO 等是否安全?
Is it safe to derive MonadThrow, MonadCatch, MonadBaseControl, MonadUnliftIO, etc?
我正在重构一些旧代码,它是多态的,但类型-class 受限,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)
鉴于此上下文,自动导出以下内容是否安全:
- MonadThrow
- MonadCatch
- MonadMask
- MonadBaseControl
- MonadUliftIO
在不深入了解 GHC 内部结构的情况下,什么是培养编译器自动派生时实际发生的直觉的最佳方式?
用户手册有关于每个扩展的文档,而且它在不断完善;这是关于推导的部分,应该足以知道实际发生了什么:https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#extensions-to-the-deriving-mechanism
在这种情况下,所有 类 都由 GeneralizedNewtypeDeriving
处理。
{-# LANGUAGE GeneralizedNewtypeDeriving, UndecidableInstances #-}
module M where
import Control.Monad.IO.Unlift
import Control.Monad.Catch
import Control.Monad.Trans.Control
import Control.Monad.Base
import Control.Monad.Reader
newtype Foo a = Foo (ReaderT () IO a)
deriving (Functor, Applicative, Monad, MonadIO, MonadUnliftIO, MonadThrow, MonadCatch, MonadMask, MonadBase IO, MonadBaseControl IO)
一般来说,user-defined 类 的三个相关扩展是 GeneralizedNewtypeDeriving
、DerivingVia
和 DeriveAnyType
。而且还值得启用 DerivingStrategies
来明确使用哪个。
我正在重构一些旧代码,它是多态的,但类型-class 受限,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)
鉴于此上下文,自动导出以下内容是否安全:
- MonadThrow
- MonadCatch
- MonadMask
- MonadBaseControl
- MonadUliftIO
在不深入了解 GHC 内部结构的情况下,什么是培养编译器自动派生时实际发生的直觉的最佳方式?
用户手册有关于每个扩展的文档,而且它在不断完善;这是关于推导的部分,应该足以知道实际发生了什么:https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#extensions-to-the-deriving-mechanism
在这种情况下,所有 类 都由 GeneralizedNewtypeDeriving
处理。
{-# LANGUAGE GeneralizedNewtypeDeriving, UndecidableInstances #-}
module M where
import Control.Monad.IO.Unlift
import Control.Monad.Catch
import Control.Monad.Trans.Control
import Control.Monad.Base
import Control.Monad.Reader
newtype Foo a = Foo (ReaderT () IO a)
deriving (Functor, Applicative, Monad, MonadIO, MonadUnliftIO, MonadThrow, MonadCatch, MonadMask, MonadBase IO, MonadBaseControl IO)
一般来说,user-defined 类 的三个相关扩展是 GeneralizedNewtypeDeriving
、DerivingVia
和 DeriveAnyType
。而且还值得启用 DerivingStrategies
来明确使用哪个。