2012-11-25 49 views
2

這可能是一個簡單的問題,我在SO上看到過類似的問題,但仍然卡住了。Snap Framework:我如何在處理程序中運行IO

我試圖做一個HTTP調用來拉入另一個博客的內容並將其顯示在我的頁面上。這比其他任何東西都更適合學習。

這裏是我的處理程序

blog :: App1Handler() 
blog = do 
    contents <- Requester.getUrl "http://someblog.com/" 
    heistLocal (bindString "contents" contents) . render $ "blog" 

Requester.getUrl已簽名的getURL ::字符串 - > IO T.Text

和錯誤我得到的回覆是

的src/Main.hs:50:15:
無法匹配預期類型Handler App1 App1 t0' with actual type IO T.Text'
在返回類型的`的getURL呼叫的」
在的語句 '做' 塊:
內容< - 使用getURL 「http://someblog.com/」
在表達式:
做{內容< - 使用getURL 「http://someblog.com/」;
heistLocal(bindString「contents」contents)。渲染$「博客」}

從我收集,我被困在IO monad裏面,它想要類型Handler App1 App1 t0。我嘗試過將liftIO固定在某些地方,但我對此很困惑。

任何人都可以指向正確的方向嗎?

謝謝!

+0

假設'App1Handler'是一個典型的支持'IO'的monad堆棧,它應該只是'contents < - liftIO $ Requester.getUrl「http://someblog.com/」'。你嘗試過嗎? – hammar

+0

好吧,我會的。我完全困惑。我認爲,如果內容是IO(a)類型,那麼我想把'heistLocal(bindString「contents」)'放在它上面,就像一個函子一樣。感謝哈馬爾,我有一些閱讀要做。此外,我感謝你在這裏的所有答案 - 我一直在回答你已經回答的問題! – Brian

回答

5

你只需要liftIOIO採取行動getUrl返回,就像這樣:

contents <- liftIO $ Requester.getUrl "http://someblog.com/" 

這裏的理由很簡單。您有一個類型爲App1Handler()的do-block,這意味着此do-block中任何<-語句的右側 必須具有類型App1Handler a

然而,getUrl回報IO Text,所以你需要一個函數從 IO a轉換爲App1Handler a這正是liftIO一樣。

liftIO :: MonadIO m => IO a -> m a 
+1

輝煌,非常感謝!這是因爲我誤解你可能在do塊的每一行都有不同的單子。 – Brian

相關問題