Haskell 将monad转换器添加到Yesod处理程序堆栈
如何将另一个monad转换器添加到YesodHaskell 将monad转换器添加到Yesod处理程序堆栈,haskell,yesod,monad-transformers,Haskell,Yesod,Monad Transformers,如何将另一个monad转换器添加到YesodHandler堆栈 具体来说,我想从Control.Monad.CryptoRandom添加CRandT,这样我就可以为会话ID和密码密钥之类的东西生成安全的随机数 如果我成功地将其添加到堆栈中,它将在对web服务器的调用中共享,还是会为每个连接生成一个新的调用?我关心的原因是后者将使用用于初始化生成器的熵,而前者将在初始化后继续使用相同的生成器 或者可能我太离谱了,完全不了解monad transformer stacks。@bheklillr的想法
Handler
堆栈
具体来说,我想从Control.Monad.CryptoRandom
添加CRandT
,这样我就可以为会话ID和密码密钥之类的东西生成安全的随机数
如果我成功地将其添加到堆栈中,它将在对web服务器的调用中共享,还是会为每个连接生成一个新的调用?我关心的原因是后者将使用用于初始化生成器的熵,而前者将在初始化后继续使用相同的生成器
或者可能我太离谱了,完全不了解monad transformer stacks。@bheklillr的想法绝对是你可以采用的方法。一般来说,在YesSOD中不能在
HandlerT
下面插入转换器,因为框架不知道如何将其展开
确实有另一种方法:您可以在基础数据类型中保留一个随机数生成器,如<代码> IORef < /代码>,然后为您的特定<代码> HandlerT App IO < /代码>单元格定义<代码> MundCurrOD/<代码>实例。我没有任何使用MonadCRandom的经验,因此我无法立即演示如何使用,但我认为这应该不会太难。您可能可以围绕
CRandT
的MonadRandom
实例来实现CRandT g Handler我认为您可以将CRandT g Handler
作为您的monad,在为处理程序
类型应用run函数之前,您必须使用runCRandT
或evalCRandT
。Michael-有趣的是,您应该提到它。我刚在你的网站上找到wiki页面。正在调查。谢谢。请注意,我在Yesod的书中添加了对此的深入解释和演示:非常好!它恰好回答了我所问的问题:-)。顺便说一句,O'Reilly什么时候印刷你的新书?我想买一份更新版。我没有确切的出版日期,这取决于我什么时候拿到手稿,这取决于我什么时候拿到1.4版。可能六个月是上限。