데이터베이스에 대한 많은 액세스 권한을 가진 Happstack 응용 프로그램을 만들고 싶습니다.Happstack에서 데이터베이스 모나드 스택을 만드는 방법은 무엇입니까?
itemsRequest :: ServerConfig -> ServerPart Response
itemsRequest cf = dir "items" $ do
methodM [GET,HEAD]
liftIO $ noticeM (scLogger cf) "sended job list"
items <- runDBMonad (scDBConnString cf) $ getItemLists
case items of
(Right xs) -> ok $ toResponse $ show xs
(Left err) -> internalServerError $ toResponse $ show err
으로 : 나는 바닥 (중간에 로그 라이터와) 상단에 데이터베이스 쓰기와 같은 모나드에서 IO와 모나드 스택은 각 액세스 예에서 명확한 기능을 가지고 일 것이라고 생각 :
getItemList :: MyDBMonad (Error [Item])
getItemList = do
-- etc...
하지만 모나드와 모나드 변압기 (나는 그것에 대해 배울 수있는 운동으로이 질문을 참조)의 약간의 지식을 가지고, 내가 어떻게 방법 IO를 해제하는 데이터베이스 모나드의 생성을 시작하는 아무 생각이 없다 happstack에서 데이터베이스 스택, ... 등. 이 경우, 우리는 모든 사람이 얻을하려는 값이 데이터베이스 연결이 -
type MyMonad a = ReaderT DbHandle ServerPart a
Reader
모나드 변압기가 ask
기능을 사용하여 액세스 할 수있는 단일 값을 만드는이 :
'unsafePerformIO'를 사용하여 IO를 시도했습니다. Happstack은 순수한 조합을 사용하기 때문에 IO를 수행하는 유일한 방법 일 수 있습니다. – Nybble
@Wu Xingbo, liftIO를 사용하여 쉼 스택에서 IO를 수행 할 수는 있지만 다른 모나드 스택으로 전달할 사람을 알지 못합니다. – Zhen