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

Bri*_*ian 2 monads haskell haskell-snap-framework

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

我正在尝试进行HTTP调用以获取另一个博客的内容并将其显示在我的页面上.这比任何事情都更像是一种学习练习.

这是我的经纪人

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

Requester.getUrl具有签名getUrl :: String - > IO T.Text

我得到的错误是

src/Main.hs:50:15:
无法匹配期望的类型Handler App1 App1 t0' with actual typeIO T.Text'
在'getUrl'调用的返回类型中
'do'块的stmt:
contents < - getUrl"http:/ /someblog.com/"
在表达式中:
do {contents < - getUrl"http://someblog.com/";
heistLocal(bindString"contents"内容).渲染$"博客"}

从我收集的内容来看,我被困在IO monad中,它想要Handler App1 App1 t0类型.我试过在某些地方坚持使用liftIO,但我对此非常困惑.

谁能指出我正确的方向?

谢谢!

ham*_*mar 6

您只需要返回liftIOIO操作getUrl,如下所示:

contents <- liftIO $ Requester.getUrl "http://someblog.com/"
Run Code Online (Sandbox Code Playgroud)

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

但是,getUrl返回IO Text,所以你需要一个函数来转换 IO a,App1Handler a这正是做什么的liftIO.

liftIO :: MonadIO m => IO a -> m a
Run Code Online (Sandbox Code Playgroud)