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 { content <- getUrl "http://someblog.com/";
heistLocal (bindString "contents" コンテンツ) . $「ブログ」をレンダリングする}

私が収集したものから、私は IO モナドの内部で立ち往生しており、タイプ Handler App1 App1 t0 が必要です。私はいくつかの場所にliftIOを貼り付けて実験しましたが、これについてはかなり混乱しています。

誰かが私を正しい方向に向けることができますか?

ありがとう!

4

1 に答える 1

6

次のようにliftIOIOによって返されるアクションを実行するだけです。getUrl

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

ここでの理由は簡単です。type のdo ブロックがあります。これは、この do ブロック内App1Handler ()のステートメントの右側<-が type でなければならないことを意味しApp1Handler aます。

ただし、 をgetUrl返すため、正確に何を行うかIO Textを変換する関数が必要 IO aです。App1Handler aliftIO

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