1

HDBC スナップレットを使用するためのチュートリアルでは、「HDBC スナップレットを設計する際の目標の 1 つは、関数を Handler モナドまたはスナップ関連のモナドから分離することでした。これにより、同じクエリを外部でも実行できるようになりました。コマンドライン ツールなどのスナップ コンテキスト。」

私はこれだけを達成しようとしています。

型クラス HasHdbc には定義があります

class  (  IConnection c
       ,  ConnSrc s
       ,  MonadCatchIO m
       )
  =>   HasHdbc m c s | m -> c s where
  getHdbcState :: m (HdbcSnaplet c s)

Snap アプリのこの型クラスのインスタンスを次のように定義します。

instance HasHdbc (Handler App App) Connection IO where
  getHdbcState = with dbLens get

HasHdbc 型クラスを使用して、Snap コンテキストの外でこのコマンド ライン ツールを作成する方法をスケッチできますか? 私は基本的なレベルで型クラスを理解していますが、型シグネチャgetHdbcState :: m (HdbcSnaplet c s)は、たとえば IO モナドのインスタンスを定義するのが少し難しいです。

4

1 に答える 1

1

あなたは正しい軌道に乗っています。使用したいモナドに対して HasHdbc インスタンスを定義する必要があります。そのためには、HdbcSnaplet を返す関数 getHdbcState を定義する必要があります。そのデータ型に含まれる情報はどこからともなく得られるものではありませんが、getHdbcState 関数は引数を取りません。つまり、データベース サーバーの定数を入力するか、ファイルなどから定数を読み取る必要があります。より柔軟なアプローチは、ReaderT または Reader の HasHdbc インスタンスを作成することです。

于 2012-12-04T15:39:13.940 に答える