2014-11-17 9 views
3

나는 웹 요청을 수락하고 (필요에 따라 데이터베이스를 컨설팅) 응답을 빌드하는 기능Hasql의 세션 및 IO

app :: Request -> H.Session H.Postgres IO Response 

을 썼다. 이 새로운를 생성하기 때문에이 정말 나쁜

runSettings appSettings $ runApp pgSettings sessSettings 

을 : 실제로 응답을 보내려면 내가 요청을 루프 WarprunSettings이 기능을 영원히 전달하고 처리 래퍼

runApp :: H.Postgres -> H.SessionSettings -> Application 
runApp pg sess req respond = 
    respond =<< H.session pg sess (app req) 

했다 연결 풀의 목적과 준비된 명령문을 무시하는 모든 요청에 ​​대해 세션.

runSettingsH.session으로 바꾸고 싶습니다. 그러나 runSettingsSettings -> Application -> IO()의 서명이 있고 내로 들어가면 세션에 액세스 할 수 없습니다. Session b m r 내부로 돌아갈 수있는 방법이 있습니까?

개인 이메일의 질문을 다시 게시 한 것입니다.

답변

3

예에서 모든 요청에 ​​대해 새 세션을 만들면 받아 들일 수 없습니다.

우선 Session is just and alias to the reader monad transformer입니다. 풀에 직접 액세스 할 수 있습니다. 그래서 당신은 항상 수행 할 수 있습니다

session postgresSettings sessionSettings $ do 
    -- session' :: H.Session b m r -> m r 
    session' <- flip runReaderT <$> ask 
    let runApp request respond = 
     respond =<< session' (app request) 
    liftIO $ do 
    -- run warp here 

둘째, ReaderT 유사한 패턴을 구성하는 MonadBaseControl 인스턴스를 가지고있다.