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が発生します。
ハスケルのモナドとハッシュスタックの経験が豊富な人からヒントを得たいと思っています。
ありがとうございました。
それは私に正しいように見えます。もう一つのオプションは 'DBServerPart a = ServerPartT(ReaderT MongoPool IO)a'を実行し、' mapServerPartT'を使用して 'ServerPartT IO'にフラット化することです。 2つのソリューションの違いはほとんどありません。このメソッドでは、 'HSX'を使うと' ServerPartT'に 'XMLGenerator'インスタンスを利用することができます。ほとんどの場合、あなたがそれをどのようにして行うかは関係ありません。 – stepcut