
Here's what I'm working with, followed by what I am trying to do, and the type error I get. I'm leaving things out that I do not think are important. Let me know if I'm missing nessecary info.
curlResp :: (MonadError String m, MonadIO m) => Curl -> URLString -> [CurlOption] -> m String --CurlResponse curlResp curl url opts = do resp <- liftIO $ (do_curl_ curl url opts :: IO CurlResponse) let code = respCurlCode resp status = respStatus resp if code /= CurlOK || status /= 200 then throwError $ "Error: " ++ show code ++ " -- " ++ show status else return $ respBody resp
screenScraping :: String -> [String] screenScraping responseBody = let collectedStrings = processHTML responseBody collectedIDLists = createIDList collectedStrings in constructedResourceURIs urlBase collectedIDLists
resourceOpts :: [CurlOption] resourceOpts = [ CurlHttpHeaders [ "Accept: text/javascript, text/html, application/xml, text/xml, */*" , "Accept-Language: en-us,en;q=0.5" , "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7" , "Keep-Alive: 115" , "Connection: keep-alive" , "X-Requested-With: XMLHttpRequest" , "X-Prototype-Version: 1.6.0.3" ] , CurlEncoding "gzip,deflate" ]
obtainCookies :: IO Curl -> String -> IO () obtainCookies curl responseBody = do curl' <- curl let collectedResources = screenScraping responseBody in mapM ( curlResp curl' resourceOpts)
collectedResources > return ()
main :: IO () main = do curl <- initCurl user:pass:_ <- getArgs resp <- generateResourceHtml user pass
case resp of Left err -> print err Right body -> obtainCookies curl body
Here's the error I get. Couldn't match expected type `Char' against inferred type `CurlOption' Expected type: URLString Inferred type: [CurlOption] In the second argument of `curlResp', namely `resourceOpts' In the first argument of `mapM', namely `(curlResp curl' resourceOpts)' The problem I see is a misformed mapM. I am trying to do something like this curlResp curl' resourceOpts "-here-be-a-url" where collectedResources is a [String]. Not sure how to map over it correctly. The other problem I see is this
obtainCookies :: IO Curl -> String -> IO () obtainCookies curl responseBody = do curl' <- curl let collectedResources = screenScraping responseBody in mapM ( curlResp curl' resourceOpts)
collectedResources > return ()
this function does a monadic action (all I want is the cookies) and I don't need the return value. I am not sure that the final line return (), is what I want. My primary question is this. how do I map over collectedResources correctly? Secondary question, is the return correct?