[英]Snap Framework: How do I run IO within a handler
這可能是一個簡單的問題,我在SO上也看到過類似的問題,但是我仍然很困惑。
我正在嘗試進行HTTP調用以提取另一個博客的內容並將其顯示在我的頁面上。 這比任何東西都更重要。
這是我的經理
blog :: App1Handler ()
blog = do
contents <- Requester.getUrl "http://someblog.com/"
heistLocal (bindString "contents" contents) . render $ "blog"
Requester.getUrl具有簽名getUrl :: String-> 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“內容”內容)。 渲染$“ blog”}
從我的收集中,我陷入了IO monad的內部,並且它希望類型為Handler App1 App1 t0。 我已經嘗試過將liftIO粘貼在某些地方,但是對此我感到很困惑。
誰能指出我正確的方向?
謝謝!
您只需要liftIO
由getUrl
返回的IO
操作,就像這樣:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.