通常、Happstackを使用するときに、ハンドラに使用する自分のサーバーのモナドを作成しています。私は最近、happstack-clientsession
-Packageを発見しました。これは大きな助けとなり、私自身の解決策を書くのを妨げています。MonadReader/MonadErrorインスタンスをTransformer型に追加する
ClientSessionT
モナドには私自身の配線に少し問題がありますが、結果として、MonadReader
またはMonadError
のインスタンスが存在しないため、ラッパーモナドでインスタンス化できません。ここで
は、モジュールの完全なコードです:
{-# LANGUAGE OverloadedStrings, GeneralizedNewtypeDeriving, DeriveDataTypeable, EmptyDataDecls, TemplateHaskell #-}
module Server where
import Control.Monad
import Control.Monad.Error
import Control.Monad.Reader
import Control.Monad.Trans
import Data.Data (Data, Typeable)
import Data.SafeCopy (base, deriveSafeCopy)
import Database.MongoDB as M
import Happstack.Server
import Happstack.Server.Error
import Happstack.Server.ClientSession
import System.IO.Pool
import System.IO.Error
import Web.ClientSession (getDefaultKey)
type MongoPool e = Pool e Pipe
data PonySession = PonySession -- TODO: Fill in User type when available
deriving (Ord, Read,Show, Eq, Typeable, Data)
$(deriveSafeCopy 0 'base ''PonySession)
instance ClientSession PonySession where
empty = PonySession
newtype PonyServerPartT e m a = PonyServerPart (ClientSessionT PonySession (ReaderT (MongoPool IOError) (ServerPartT (ErrorT e m))) a)
deriving (Monad, MonadIO, MonadReader (MongoPool e), MonadError e, ServerMonad, MonadPlus)
type PonyServerPart = PonyServerPartT IOError IO
runServerT s = mapServerPartT' (spUnwrapErrorT errorHandler) $ do
key <- liftIO getDefaultKey
let sessConf = (mkSessionConf key) { sessionCookieLife = MaxAge $ 60 * 60 * 24 * 7 }
pool <- liftIO mongoPool
runReaderT (runClientSessionT s sessConf) pool
where errorHandler = simpleErrorHandler . show
mongoPool :: IO (MongoPool IOError)
mongoPool = newPool fac 10
where fac = Factory {
newResource = connect $ M.host "127.0.0.1",
killResource = close,
isExpired = isClosed
}
私は取得していますエラーは明白です:MonadError
とMonadReader
から導出は動作しません。しかし、私はそれらを必要とするでしょう、そうでなければ全体のパフォーマンスは役に立たないです。
これはどのように行われたのか分かりませんでしたので(deriving
に依存しています)、この特定の問題をカバーする回答をお願いしたいと思います。
私はこのエラーが発生する理由について知っています、私は私の質問でそう言いました。私の実際の質問は、この特定のモナドタイプのインスタンスを追加する方法です。 – Lanbo