4

カスタムモナド(リーダー付き)を使用して、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では、グローバル状態を使用せずに、サーバントの認証ハンドラーに追加のデータを渡すにはどうすればよいでしょうか?

4

1 に答える 1