将monad变换器添加到Yesod Handler堆栈

时间:2014-08-28 14:20:42

标签: haskell yesod monad-transformers

如何将另一个monad变换器添加到Yesod Handler堆栈?

具体来说,我想从CRandT添加Control.Monad.CryptoRandom,以便我可以为会话ID和密码密钥生成安全随机数。

如果我确实设法将其添加到堆栈中,它是否会在对Web服务器的调用之间共享,还是会为每个连接生成一个新的?我关心的原因是后者将耗尽用于初始化生成器的熵,而前者将在初始化后继续使用相同的生成器。

或许我离开基地并且完全不了解monad变压器堆栈。

1 个答案:

答案 0 :(得分:2)

@ bheklilr的想法绝对是您可以采取的方法。一般来说,你不能在Yesod中的HandlerT下面插入变换器,因为框架不知道如何打开它。

似乎还有另一种方法:您可以在基础数据类型中保留一个类似IORef的随机数生成器,然后为您的特定MonadCRandom定义HandlerT App IO实例单子。我对MonadCRandom没有任何经验,所以我无法立即展示如何做到这一点,但我认为这不应该太难。您可以将实现基于MonadCRandom的{​​{1}}实例。