2012-04-01 8 views
3

私はHappstackサーバーを作成しており、接続するMongoDBデータベースがあります。それは、これがすべてでpoolを運ぶために必要とは明らかですReaderでServerPartT Monadを拡張する

runDB :: (MonadIO m) => MongoPool -> Action IO a -> m (Either Failure a) 
runDB pool f = liftIO $ do 
    pipe <- runIOE $ aResource pool 
    access pipe master dbName f 

:そのために、私はその後、作成したプールでActionを実行するための機能を

type MongoPool = Pool IOError Pipe 

withMongo :: (MongoPool -> IO a) -> IO() 
withMongo f = do 
    pool <- dbPool 
    f pool 
    killAll pool 

接続プールを作成する関数を作り、経路をパラメータとして使用します。私はそれを ReaderTにラップしたいので、 runDBのタイプは Action IO a -> ServerPart (Either Failure a)、さらには Action IO a -> ServerPart aのようになり、失敗すると自動的にHTTPエラー500が発生します。

ハスケルのモナドとハッシュスタックの経験が豊富な人からヒントを得たいと思っています。

ありがとうございました。

答えて

3

この質問を通じて、私は非常に良いヒントを持つ別のものを見つけました。これを構築しました。それは正常に動作するようだと私はそれを共有すると思った:

type MongoPool = Pool IOError Pipe 

type DBServerPart a = ReaderT MongoPool (ServerPartT IO) a 

hostName = "127.0.0.1" 

dbName = "test" 

defaultPoolSize = 10 

runDB :: Action IO a -> DBServerPart (Either Failure a) 
runDB f = do 
    pool <- ask 
    liftIO $ do 
     pipe <- runIOE $ aResource pool 
     access pipe master dbName f 

withMongo :: DBServerPart a -> ServerPart a 
withMongo f = do 
    pool <- liftIO $ dbPool 
    a <- runReaderT f pool 
    liftIO $ killAll pool 
    return a 

dbPool = newPool fac defaultPoolSize 
    where fac = Factory { 
      newResource = connect $ host hostName, 
      killResource = close, 
      isExpired = isClosed 
     } 
+0

それは私に正しいように見えます。もう一つのオプションは 'DBServerPart a = ServerPartT(ReaderT MongoPool IO)a'を実行し、' mapServerPartT'を使用して 'ServerPartT IO'にフラット化することです。 2つのソリューションの違いはほとんどありません。このメソッドでは、 'HSX'を使うと' ServerPartT'に 'XMLGenerator'インスタンスを利用することができます。ほとんどの場合、あなたがそれをどのようにして行うかは関係ありません。 – stepcut