我试图在我的 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
or 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 ()
printAccountCount
执行返回 Int 的查询,并printAHasqlString
运行 Text 查询。两者都只是打印结果,并返回一个IO ()
.
但是当我尝试在同一个应用程序中运行这两个查询时,数据类型r
中的类型变量Session
被锁定,并且无法与第二个进行编译。
错误信息:
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