簡體   English   中英

Snap Framework:如何在處理程序中運行IO

[英]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粘貼在某些地方,但是對此我感到很困惑。

誰能指出我正確的方向?

謝謝!

您只需要liftIOgetUrl返回的IO操作,就像這樣:

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

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM