作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个可以对数据库进行大量访问的 Happstack 应用程序。我认为底部带有 IO 的 Monad Stack 和顶部类似数据库写入的 monad(中间是日志写入器)将有助于在每次访问中具有清晰的功能,例如:
itemsRequest :: ServerConfig -> ServerPart Response
itemsRequest cf = dir "items" $ do
methodM [GET,HEAD]
liftIO $ noticeM (scLogger cf) "sended job list"
items <- runDBMonad (scDBConnString cf) $ getItemLists
case items of
(Right xs) -> ok $ toResponse $ show xs
(Left err) -> internalServerError $ toResponse $ show err
与:
getItemList :: MyDBMonad (Error [Item])
getItemList = do
-- etc...
但是我对 Monad 和 Monad Transformers 知之甚少(我将这个问题视为学习它的练习),并且我不知道如何开始创建 Database Monad,如何将 IO 从 happstack 提升到数据库堆栈等。
最佳答案
这里是一些从上面的代码片段编译而来的最小工作代码,供像我这样困惑的新手使用。
您将内容放入 AppConfig
类型中,并在响应生成器中使用 ask
获取它。
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Happstack.Server
import Control.Monad.Reader
import qualified Data.ByteString.Char8 as C
myApp :: AppMonad Response
myApp = do
-- access app config. look mom, no lift!
test <- ask
-- try some happstack funs. no lift either.
rq <- askRq
bs <- lookBS "lol"
-- test IO please ignore
liftIO . print $ test
liftIO . print $ rq
liftIO . print $ bs
-- bye
ok $ toResponse ("Oh, hi!" :: C.ByteString)
-- Put your stuff here.
data AppConfig = AppConfig { appSpam :: C.ByteString
, appEggs :: [C.ByteString] } deriving (Eq, Show)
config = AppConfig "THIS. IS. SPAAAAAM!!1" []
type AppMonad = ReaderT AppConfig (ServerPartT IO)
main = simpleHTTP (nullConf {port=8001}) $ runReaderT myApp config {appEggs=["red", "gold", "green"]}
关于haskell - 如何在 Happstack 中创建数据库 Monad Stack?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7806554/
我是一名优秀的程序员,十分优秀!