Snap Framework:如何在处理程序中运行IO

时间:2012-11-25 19:22:50

标签: haskell monads haskell-snap-framework

这可能是一个简单的问题,我在SO上看过类似的问题,但我仍然陷入困境。

我正在尝试进行HTTP调用以获取另一个博客的内容并将其显示在我的页面上。这不仅仅是一种学习练习。

这是我的处理程序

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

Requester.getUrl具有签名getUrl :: String - &gt; IO T.Text

我得到的错误是

  

的src / Main.hs:50:15:
     无法匹配预期类型Handler App1 App1 t0' with actual type IO T.Text'
     在`getUrl'的调用的返回类型中      在'do'区块中:        内容&lt; - getUrl“http://someblog.com/”
     在表达式中:
       do {contents&lt; - getUrl“http://someblog.com/”;
            heistLocal(bindString“contents”内容)。渲染$“博客”}

从我收集的内容来看,我被困在IO monad中,它想要Handler App1 App1 t0类型。我已尝试在某些地方粘贴liftIO,但我对此非常困惑。

有人能指出我正确的方向吗?

谢谢!

1 个答案:

答案 0 :(得分:5)

您必须liftIOIO返回的getUrl操作,如下所示:

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