2014-08-28 86 views
2

如何將另一個單粒變換器添加到Yesod Handler堆棧中?向Yesod處理程序堆棧中添加單粒變換器

具體而言,我想從Control.Monad.CryptoRandom中添加CRandT,這樣我就可以爲諸如會話ID和密碼鍵之類的事物生成安全的隨機數。

如果我確實設法將它添加到堆棧中,它將在對Web服務器的調用中共享還是將爲每個連接生成一個新的?我關心的原因是後者將使用用於初始化發生器的熵,而前者將在初始化後繼續使用相同的發生器。

或者我可能離開基地,完全不理解monad變壓器堆棧。

+2

我認爲你可以將'CRandT g Handler'做爲你的monad,並且在你爲'Handler'類型應用運行函數之前,你必須使用'runCRandT'或'evalCRandT'。 – bheklilr 2014-08-28 14:45:58

回答

2

@ bheklilr的想法絕對是您可以採取的方法。一般來說,你不能在Yesod中的HandlerT下插入變壓器,因爲框架不知道如何解開它。

似乎還有另一種方法:您可以在基礎數據類型中保留一個類似於IORef的隨機數生成器,然後爲您的具體HandlerT App IO monad定義一個MonadCRandom實例。我沒有MonadCRandom的任何經驗,所以我不能提供即時演示如何做到這一點,但我認爲它不應該太難。您可能可以基於的實例圍繞MonadCRandom實例。

+0

邁克爾 - 搞笑你應該提到它。我剛剛在您的網站上找到了wiki頁面https://github.com/yesodweb/yesod/wiki/Keeping-(in-memory)-state-with-yesod。現在調查。謝謝。 – Ralph 2014-08-28 15:05:39

+2

請注意,我在Yesod書中增加了對此的深入解釋和演示:http://www.yesodweb.com/book/yesods-monads#yesods-monads_adding_a_new_monad_transformer – 2014-08-30 20:37:50

+0

非常好!它巧合地回答了我問的問題:-)。順便說一句,O'Reilly是在什麼時候印刷你書的新版本?我想購買更新的副本。 – Ralph 2014-08-31 11:31:48