2012-01-27 35 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。谢谢大家