【发布时间】:2017-06-17 07:28:44
【问题描述】:
这个问题早在 2010 年就有人问过了,但我认为今天可能会有更好的答案。 基本上我需要存储某种对象并在每个请求中访问它,理想情况下我希望能够从请求中更改该对象(我猜 MVar 或 IORef 会这样做)。
snaplet 教程似乎表明它是可能的,但它主要解释了如何使用 snaplet(毕竟那是那个教程的目的),并没有真正解释这个“应用程序”对象是如何工作的,甚至是如何存储的。我不知道如何将它应用到我不需要 snaplets 的情况下(我正在制作一个 API,所以我什至不需要 Heist)。
所以给定默认代码:
site :: Snap ()
site = do
ifTop (writeBS "hello world") <|>
route [ ("stuff/:param", someHandler) ] <|>
dir "static" (serveDirectory ".")
如何将其更改为“注册”某个我可以在 someHandler 中使用的对象? 2010 年的答案是将其部分应用于每个处理程序,这会起作用,但 Snaplet 教程让我认为必须有更好的方法。
【问题讨论】:
-
您可以添加指向您所指答案的链接吗?
-
几乎所有的 snap 函数都有返回类型
MonadSnap m => .. -> m X。因此,只需创建一个实例MonadSnap m => MonadSnap (ReaderT m)(如果它不存在),您不必显式传递环境。
标签: haskell haskell-snap-framework