간단한 sitemap.xml 크롤러를 작성하고 있습니다. 코드는 다음과 같습니다. 제 질문은 main
의 끝에있는 코드가 아무 것도 인쇄하지 않는 이유입니다. 나는 하스켈의 lazyness 때문이다 의심하지만, 여기에 대처하는 방법을 알고하지 않습니다하스켈이 블록을 평가하지 않습니다.
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
왜'return'에'getPages'를 래핑하고 있습니까? 불필요한 것처럼 보입니다. – arrowd
@arrowdodger 반환하지 않고 컴파일 오류가 발생했습니다. 'IO'유형 'IO'와 일치하지 않습니다. with 'Control.Monad.Trans.Resource.Internal.ResourceT m' 예상 유형 : Control.Monad.Trans.Resource.Internal.ResourceT m [모두 HttpException L.ByteString] 실제 유형 : IO [모두 HttpException L.ByteString]' –