2013-07-02 2 views
1

Haskell에서 MongoDB를 사용하려고합니다. 나는 this tutorial을 시작점으로 사용하고있었습니다. 내가 전주곡에 이러한 명령을 수행 할 때, 나는 컬렉션의 목록을 얻을 : 나는 Yesod 처리기에 그것을 넣어하려고 할 때, 그러나MongoDB와 prelude와 yesod의 차이점

pipe <- runIOE $ connect $ Host "XXXXX.mongolab.com" $ PortNumber 33317 
access pipe master <databaseName> $ auth <username> <password> 
access pipe master <databaseName> allCollections 

를,이 컴파일 아니에요. 내가 가지고있다

getActivityR :: Handler Import.Value 
getActivityR = do 
    pipe <- runIOE $ connect $ Host "XXXXX.mongolab.com" $ PortNumber 33317 
    access pipe master <databaseName> $ auth <username> <password> 
    access pipe master <databaseName> allCollections 
    returnJson $ object ["activity" .= ("abc" :: Text)] 

returnJson은 내가 그 방법을 완료했다는 것을 알리기 위해 정말로있다. 결국 그것은 활동 목록을 반환합니다.

내가지고있어 오류는 다음과 같습니다

Couldn't match type `IO' with `HandlerT App IO' 

    Expected type: HandlerT App IO Pipe 

     Actual type: IO Pipe 

    In a stmt of a 'do' block: 

     pipe <- runIOE 

       $ connect $ Host "XXXXXX.mongolab.com" $ PortNumber 33317 

그래서 서곡/GHCi 내 Yesod 코드의 차이가 음모에 의해 무엇을 건설되고있다?

+4

나는 Yesod에 대해 많이 모른다. 그러나 GHCi는'IO' 모나드에서이 명령을 실행한다. 반면에 당신의 Yesod 코드는'HandlerT App IO' 모나드에서 그것을 실행하고있다. 보십시오'pipe <- liftIO $ runIOE $ ...' – Fixnum

+0

@ Fixnum의 코멘트는 실제로 대답이라고 생각합니다. –

+0

@Fixnum 그게 그 오류를 수정하는 것 같았다. 감사. 대답으로 입력하면 받아 들여 몇 가지 사항을 알려줍니다 :) – taylonr

답변

3

문제는 GHCi가 IO 모나드에서 코드를 실행하고 기능이 HandlerT App IO 모나드에있는 것입니다. 그러나 HandlerT은 모나드 변환기 IO 모나드이므로 을 사용하여 IO 동작을 HandlerT App IO 동작으로 "승격"할 수 있습니다. 리프트의 유형은 다음과 같습니다 귀하의 경우

lift :: (MonadTrans t, Monad m) => m a -> t m a 

tHandlerT AppmIO 수있다이어야한다.

getActivityR :: Handler Import.Value 
getActivityR = do 
    pipe <- lift $ runIOE $ connect $ Host "XXXXX.mongolab.com" $ PortNumber 33317 
    access pipe master <databaseName> $ auth <username> <password> 
    access pipe master <databaseName> allCollections 
    returnJson $ object ["activity" .= ("abc" :: Text)] 

나는 당신의 access이 무엇인지 모르는, 그래서 당신은 너무 여부가 리프트를해야하는지 여부를 어떻게 알 수 없습니다 그래서 올바른 코드는 다음과 같습니다. 당신의 특별한 경우를 들어

는 또한 lift 비슷하지만 IO로 바로 리프트 liftIO이뿐만 아니라 모나드 변압기의 당신의 스택의 다음 "레이어"에, 당신은 그것을 사용해야하므로 :

pipe <- liftIO $ runIOE $ connect $ Host "XXXXX.mongolab.com" $ PortNumber 33317 

이 주제에 대해 더 자세히 알고 싶다면 "모나드 변압기"를 찾아야합니다.