カスタムモナド(リーダー付き)を使用して、DBプールなどのデータをハンドラーに簡単に渡します(カスタムモナドを使用する前に、接続をfn引数として渡していました)。
これは、カスタムモナドを定義した方法です:
newtype Controller a = Controller
{ runController :: ReaderT ServerEnvironment Handler a
} deriving ( Functor, Applicative, Monad, MonadReader ServerEnvironment,
MonadError ServantErr, MonadIO )
これServerEnvironment
は、データを運ぶために使用する単なるカスタム データ型です。
問題は、私のAuthHandler
場合、関数を具体的に使用する必要があることです:
r -> Handler usr
認証ハンドラーとして、次のようなカスタムハンドラーを使用できません:
r -> Controller usr
ConnectionPool
また、署名を次のようにできないため、 my を渡す方法もありません。
ConnPool -> r -> Handler usr
IO
では、グローバル状態を使用せずに、サーバントの認証ハンドラーに追加のデータを渡すにはどうすればよいでしょうか?