Хаскелл не оценивает блок

Я пишу простой гусеничный sitemap.xml. Код ниже. Мой вопрос, почему код в конце main ничего не печатает. Я подозреваю, что это потому, что лень haskell, но не знаю, как с этим справиться:

import Network.HTTP.Conduit
import qualified Data.ByteString.Lazy as L
import Text.XML.Light
import Control.Monad.Trans (liftIO)
import Control.Monad
import Data.String.Utils
import Control.Exception

download :: Manager -> Request -> IO (Either HttpException L.ByteString)
download manager req = do
  try $
    fmap responseBody (httpLbs req manager)

downloadUrl :: Manager -> String -> IO (Either HttpException L.ByteString)
downloadUrl manager url = do
  request <- parseUrl url
  download manager request

getPages :: Manager -> [String] -> IO [Either HttpException L.ByteString]
getPages manager urls =
  sequence $ map (downloadUrl manager) urls

main = withManager $ \ manager -> do
  -- I know simpleHttp is bad here
  mapSource <- liftIO $ simpleHttp "http://example.com/sitemap.xml"

  let elements = (parseXMLDoc mapSource) >>= Just . findElements (mapElement "loc")
      Just urls = liftM (map $ (replace "/#!" "?_escaped_fragment_=") . strContent) elements
      mapElement name = QName name (Just "http://www.sitemaps.org/schemas/sitemap/0.9") Nothing

  return $
    getPages manager urls >>= \ pages -> do
      print "evaluate me!"
      sequence $ map print pages

2 ответа

Решение

Вы столкнулись с той же проблемой, которую я описал здесь, по крайней мере, из-за неправильного кода, который проверяет тип, когда он действительно должен выдать ошибку типа: почему тип "Main.main", "IO ()", а не "IO a"?, Вот почему вы должны всегда давать main тип подписи main :: IO () в явном виде.

Чтобы решить проблему, вам нужно заменить return с lift (см. http://hackage.haskell.org/package/transformers/docs/Control-Monad-Trans-Class.html) и замените sequence $ map ... с mapM_, mapM_ f эквивалентно sequence_ . map f,

Подставь свой последний return с runResourceT ( http://hackage.haskell.org/package/resourcet-1.1.1/docs/Control-Monad-Trans-Resource.html). Как следует из его типа, это превратит ResourceT в IO-действие.

Другие вопросы по тегам