- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何访问 ReaderT 的内部 monad。
在我的例子中,我有类型:
newtype VCSSetupAction a = VCSSetupAction (ReaderT (Maybe VCSConf) IDEM a)
deriving (Monad, MonadIO, MonadReader (Maybe VCSConf))
我无法在这个 Monad 中运行的函数中访问(也许是 VCSConf)
commitAction' :: Common.VCSAction ()
commitAction' = do
config <- ask
...
但我也应该能够访问内部的 IDEM,它的类型是:
type IDEM = ReaderT IDERef IO
所以我希望能够做类似的事情
commitAction' :: Common.VCSAction ()
commitAction' = do
config <- ask
ideRef <- lift $ ask -- this does not compile/work
我对 Monad 的理解还不够好。感谢您的帮助。
最佳答案
要直接使用 lift
,您的 newtype
必须派生 MonadTrans
,但由于它不是转换器,因此这在本文中是不合适的案子。相反,您可以将操作包装在数据构造函数中。现在您直接与 ReaderT
打交道,因此您可以使用它的 lift
。
ideRef <- VCSSetupAction $ lift $ ask
您可能想为此定义一个帮助器,使事情变得更干净。
关于Haskell(嵌套)ReaderT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8288953/
如何访问 ReaderT 的内部 monad。 在我的例子中,我有类型: newtype VCSSetupAction a = VCSSetupAction (ReaderT (Maybe VCSCo
我正在使用 ReaderT 为这种类型编写 Monad 实例并通过派生 newtype HIO a = HIO {runHIO :: Set HiPermission -> IO a} 我试过这样做
我想这样玩元组和镜头: myfct :: ReaderT (a,b,c,d,e) m a -> ReaderT (a,c,d) m a myfct = zoom ... 能够将输入元组修改为它的子集.
假设我有这样的环境记录: import Control.Monad.IO.Class import Control.Monad.Trans.Reader type RIO env a = Reader
我一直在关注和扩展教程 Write Yourself A Scheme 。我有一个类型 LispVal 包裹在几层 monad 转换器中: import qualified Data.Map as M
看来能够组合不同的 ReaderT 环境会很有用。 例如,通用日志记录工具可能如下所示: logit :: Text -> ReaderT Bool IO () logit str = do deb
我想这样玩元组和镜头: myfct :: ReaderT (a,b,c,d,e) m a -> ReaderT (a,c,d) m a myfct = zoom ... 能够将输入元组修改为它的子集.
假设我有这样的环境记录: import Control.Monad.IO.Class import Control.Monad.Trans.Reader type RIO env a = Reader
我无法更改的函数返回 Scalaz Reader, type Action[A] = Reader[Session, A] def findAccount(s: String): Action[Acc
我基于 ReaderT design pattern 构建了一个项目.我没有使用类型类方法进行依赖注入(inject),而是选择使用简单的处理程序注入(inject)作为函数参数。这部分工作正常,因为
我经常使用以下样板,并希望将其消除。它看起来像这样: type Configured = ReaderT Config doSomething :: Configured IO Data doSome
如何使用 Reader/ReaderT 来询问列表类型,例如[(Int, Int)] 然后在列表 monad 内执行计算(要求的类型)? 下面是我损坏的代码,为了清晰起见,缩短了代码: attempt
我想将 ReaderT 嵌入到另一个 monad 转换器中。我该怎么做呢?下面的示例使用 Scotty但我认为这与任何其他 monad 都是一样的。 {-# LANGUAGE OverloadedSt
我在看the documentation对于Reader monad和 ReaderT单子(monad)变压器。 相关定义如下: newtype ReaderT k r m a :: forall k
通过保持 IORef 来通过异常来维护状态似乎要容易得多。而不是尝试使用 State Monad。下面我们有 2 个替代的 State Monad。一用StateT和另一个 ReaderT IORef
是否可以将以下函数重写为单行函数? action :: NewTenant -> AppM (Either TenantCreationError Tenant) action newTenant =
我正在使用 ReaderT Monad 转换器通过多个执行 IO 的函数从主函数传播配置数据。需要数据的最终函数不执行任何 IO。我有这个工作解决方案: import Control.Monad.Re
我正在设计一个小游戏,它基本上使用 StateT 并且只是更新状态。以下是简化版本: {-# LANGUAGE TemplateHaskell #-} import Control
我试图了解 Servant 的 serveWithContext 函数的用途。文档指出它不是 ReaderT Monad 的替代品,但我不确定它试图解决 ReaderT 尚未解决的问题。 例如,这是来
我想写一个haskell程序来读取配置并做点什么。配置是 Data.Map并将被注入(inject)到 Reader 中。当我们找不到配置项时,应该中断读取。刚刚停止,不需要错误消息。所以我只想要一个
我是一名优秀的程序员,十分优秀!