2012-01-27 73 views
13

我正在玩寫一個網絡應用程序。在這種情況下,我使用的是scottyredis,但是這個問題出現在任何web/db組合中。在此之前我使用過happstack,所以我也喜歡那裏的例子。將兩個單元組合在一起時沒有變壓器?

斯科蒂有你在一個嵌套的單子,這使得它易於訪問的路線內的數據庫連接定義路由:

main = do 
    db <- connect defaultConnectInfo 
    scotty 3000 $ do 

    get "/keys" $ do 
     keys <- liftIO $ runRedis db $ keys "*" 
     html $ T.pack $ show keys 

的不阻止GET有類型:Web.Scotty.ActionM()。所有的redis命令都有類型Database.Redis.Redis a。 redis或scotty都沒有monad變換器。

結合這些的最佳方法是什麼?我對haskell很陌生,但是我確實設法讓ReaderT與hamonstack中的web monad一起工作。

理想情況下,我可以以某種方式創建一個新的monad堆棧,在同一個do塊中同時支持keyshtml

+1

人們通常只會在haskell的web框架中解決liftIO嗎? – 2012-01-27 14:30:18

+1

我不知道這裏有答案,但我認爲你的問題類似於monad變形金剛。基本上,你想要實現一個類型,我們稱之爲'IdentityTT m'ma',這樣'IdentityTT m''的行爲完全像['IdentityT'](http://hackage.haskell.org/packages/archive/transformers /0.2.1.0/doc/html/Control-Monad-Trans-Identity.html)。當然,第一個要回答的問題是,如果這甚至是可能的。 – 2012-01-27 18:57:00

+0

另一種解釋問題的方法是:你是否使用liftIO來查詢所有haskell框架中的數據庫?當數據庫沒有被納入框架時,最常見的模式是什麼? – 2012-01-28 00:49:38

回答

4

出於某種原因,我覺得liftIO很醜,但它確實不錯。特別是,如果你這樣做:

queryRedis :: Connection -> Redis a -> ActionM a 
queryRedis db r = liftIO $ runRedis db r 

,並定義一個部分應用功能redis = queryRedis db。謝謝大家