3

这可能是一个简单的问题,我在 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 typeIO T.Text'
在“getUrl”调用的返回类型中
在“do”块的结构中:
内容 <- getUrl "http:/ /someblog.com/"
在表达式中:
do { contents <- getUrl "http://someblog.com/";
heistLocal (bindString "contents" 内容) 。渲染$“博客”}

据我所知,我被困在 IO monad 中,它需要类型 Handler App1 App1 t0。我已经尝试在某些地方粘贴 liftIO ,但我对此感到很困惑。

谁能指出我正确的方向?

谢谢!

4

1 回答 1

6

您只需要执行返回liftIO的操作,如下所示:IOgetUrl

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

这里的推理很简单。你有一个 type 的 do-block App1Handler (),这意味着这个 do-block 中任何语句的右侧<-都必须有 type App1Handler a

但是,getUrl返回IO Text,所以你需要一个函数来转换 IO aApp1Handler a这正是liftIO它所做的。

liftIO :: MonadIO m => IO a -> m a
于 2012-11-25T20:08:18.390 回答