【发布时间】:2019-07-03 10:50:51
【问题描述】:
与MonadTransControl instance for a custom monad 相关,不幸的是(但可以理解)作者放弃了monad-control。但是,这不是我的选择,因为我需要在我的自定义 monad 中使用 Control.Concurrent.Async.Lifted:
{-# LANGUAGE DataKinds, GADTs, ScopedTypeVariables #-}
data FeatureFlag = Feature1 | Feature2
newtype AppM (features :: [FeatureFlag]) a = AppM (ReaderT Env IO a)
deriving (Functor, Applicative, Monad, MonadReader Env, MonadIO, MonadThrow, MonadCatch, MonadMask, MonadUnliftIO)
我尝试阅读 https://www.stackage.org/haddock/lts-12.1/monad-control-1.0.2.3/Control-Monad-Trans-Control.html,但对我来说似乎没有任何意义。 概念上我明白为什么需要MonadBaseControl 和朋友,感谢https://www.yesodweb.com/book/monad-control 的演练,但我不知道如何实现这个。
官方文档在最顶部有一个实施指南,但它假定使用 monad-transformers:
为所有转换器 T 定义实例 MonadTransControl T,在 T 的构造函数和解构函数上使用 defaultLiftWith 和 defaultRestoreT 函数。
[...]
为所有转换器定义实例 MonadBaseControl B m => MonadBaseControl B (T m):
如何为 MonadBaseControl IO (AppM fs) 编写一个合理的实例,其中 fs 部分在 monad 被解包并再次包装时被保留?另外,我假设我不是真的必须实现MonadTransControl,因为AppM fs 不是转换器。
PS:也相关 - Is it safe to derive MonadThrow, MonadCatch, MonadBaseControl, MonadUnliftIO, etc?
【问题讨论】:
-
如果你只是货物崇拜
ReaderT的实例会出现什么问题?
标签: haskell monad-transformers