1

Spock アプリケーションの外部で一度 Postgres に接続しようとしていますが、複数の戻り値の型を持つ Hasql セッション ハンドルを使用できないようです。

私のメイン アプリケーションはかなり単純ですが、コンパイルに失敗します。

mainApp :: IO Middleware
mainApp = do
  session pgConfig sessConfig $ do
    dbHandle <- sessionUnlifter
    liftIO $ do
      printAHasqlString dbHandle
      printAccountCount dbHandle
      spockT id (appMiddleware >> appRoutes dbHandle)

printAHasqlStringまたはをコメントアウトするprintAccountCountと、コンパイルされて機能します (どちらも、もう一方なしで実行すると機能します)。

printAccountCount :: (MonadBase IO m) => (Session Settings s m Int -> IO Int) -> IO ()
printAHasqlString :: (MonadBase IO m) => (Session Settings s m Text -> IO Text) -> IO ()

printAccountCountInt を返すprintAHasqlStringクエリを実行し、Text のクエリを実行します。どちらも結果を出力するだけで、IO ().

しかし、同じアプリケーションで両方のクエリを実行しようとするとr、データ型の型変数Sessionがロックされ、2 番目のクエリでコンパイルできなくなります。

エラーメッセージ:

src/Main.hs:30:25:
  Couldn't match type ‘Text’ with ‘Int’
  Expected type: Session Settings s IO Int -> IO Int
    Actual type: Session Settings s IO Text -> IO Text
  In the first argument of ‘printAccountCount’, namely ‘dbHandle’
  In a stmt of a 'do' block: printAccountCount dbHandle

更新されたエラー

以下のヘルプの後、新しいエラーが発生しました。

src/Main.hs:29:24:
    Couldn't match type ‘r0’ with ‘a’
      because type variable ‘a’ would escape its scope
    This (rigid, skolem) type variable is bound by
      a type expected by the context: Session Settings s IO a -> IO a
      at src/Main.hs:29:7-31
    Expected type: Session Settings s IO a -> IO a
      Actual type: Session Settings s IO r0 -> IO r0
    Relevant bindings include
      dbHandle :: Session Settings s IO r0 -> IO r0
        (bound at src/Main.hs:27:5)
    In the first argument of ‘printAHsqlString’, namely ‘dbHandle’
    In a stmt of a 'do' block: printAHsqlString dbHandle

その型変数を呼び出し間で柔軟に保つにはどうすればよいですか?

完全な (更新された) コード: https://gist.github.com/cschneid/4174addefb254a517f35

4

1 に答える 1

2

バージョン 0.6.0以降、面倒なことはなくなりましsessionUnlifterた。プールは直接公開されSessionており、パフォーマンスを損なうことなく何度でも実行できます。

于 2014-12-24T01:18:41.363 に答える