Send Beginners mailing list submissions to
        [email protected]

To subscribe or unsubscribe via the World Wide Web, visit
        http://www.haskell.org/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
        [email protected]

You can reach the person managing the list at
        [email protected]

When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."


Today's Topics:

   1. Re:  Trying to use map (Michael Litchard)
   2. Re:  Trying to use map (Michael Litchard)
   3. Re:  Trying to use map (Daniel Fischer)


----------------------------------------------------------------------

Message: 1
Date: Wed, 26 Jan 2011 15:32:40 -0800
From: Michael Litchard <[email protected]>
Subject: Re: [Haskell-beginners] Trying to use map
To: Daniel Fischer <[email protected]>
Cc: [email protected]
Message-ID:
        <[email protected]>
Content-Type: text/plain; charset="iso-8859-1"

Thank you.

Here is where things stand now

> obtainCookies :: IO Curl -> String -> IO ()
> obtainCookies curl responseBody = do
> curl' <- curl
> mapM_ (flip (curlResp curl') resourceOpts) $
> screenScraping responseBody


and the error

htmlParsing.lhs:78:2:
Couldn't match expected type `[Char]'
against inferred type `GHC.IO.Exception.IOException'
Expected type: String
Inferred type: IOError
When using functional dependencies to combine
MonadError IOError IO,
arising from the dependency `m -> e'
in the instance declaration at <no location info>
MonadError String IO,
arising from a use of `curlResp' at HtmlParsing.lhs:80:29-42
When generalising the type(s) for `obtainCookies'

I'm way beyond my ken here, trying to grow. I have to do error
handling (this will be production code when it grows up), got some
suggestions on how to do so, but am flying blind in new territory.

Any suggestions on how to proceed would be much appreciated.


On Wed, Jan 26, 2011 at 3:13 PM, Daniel Fischer <
[email protected]> wrote:

> On Wednesday 26 January 2011 23:51:18, Michael Litchard wrote:
> > 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.
> > >
> > >
> > > obtainCookies :: IO Curl -> String -> IO ()
> > > obtainCookies curl responseBody = do
> > >               curl' <- curl
> > >               let collectedResources = screenScraping responseBody
> > >                   in mapM ( curlResp curl' resourceOpts)
> >
> > collectedResources
> >
>
> Looks like you need a flip here:
>
>           in mapM (flip (curlResp curl') resourceOpts) collectedResources
>
> > >               return ()
>
> If you're throwing away the results of the MapM'ed actions, use mapM_
>
> obtainCookies curl responseBody = do
>    curl' <- curl
>     mapM_ (flip (curlResp curl') resourceOpts) $
>          screenScraping responseBody
>
> >
> > 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?
>
> Use mapM_
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://www.haskell.org/pipermail/beginners/attachments/20110126/27159c27/attachment-0001.htm>

------------------------------

Message: 2
Date: Wed, 26 Jan 2011 15:36:57 -0800
From: Michael Litchard <[email protected]>
Subject: Re: [Haskell-beginners] Trying to use map
To: Daniel Fischer <[email protected]>
Cc: [email protected]
Message-ID:
        <[email protected]>
Content-Type: text/plain; charset="iso-8859-1"

google hosed my indentation

> obtainCookies :: IO Curl -> String -> IO ()
> obtainCookies curl responseBody = do
>               curl' <- curl
>               mapM_ (flip (curlResp curl') resourceOpts) $
>                     screenScraping responseBody



On Wed, Jan 26, 2011 at 3:32 PM, Michael Litchard <[email protected]>wrote:

> Thank you.
>
> Here is where things stand now
>
>
> > obtainCookies :: IO Curl -> String -> IO ()
> > obtainCookies curl responseBody = do
> > curl' <- curl
> > mapM_ (flip (curlResp curl') resourceOpts) $
>
> > screenScraping responseBody
>
>
> and the error
>
> htmlParsing.lhs:78:2:
>
> Couldn't match expected type `[Char]'
> against inferred type `GHC.IO.Exception.IOException'
> Expected type: String
>
> Inferred type: IOError
> When using functional dependencies to combine
> MonadError IOError IO,
> arising from the dependency `m -> e'
> in the instance declaration at <no location info>
> MonadError String IO,
>
> arising from a use of `curlResp' at HtmlParsing.lhs:80:29-42
> When generalising the type(s) for `obtainCookies'
>
> I'm way beyond my ken here, trying to grow. I have to do error handling (this 
> will be production code when it grows up), got some suggestions on how to do 
> so, but am flying blind in new territory.
>
> Any suggestions on how to proceed would be much appreciated.
>
>
> On Wed, Jan 26, 2011 at 3:13 PM, Daniel Fischer <
> [email protected]> wrote:
>
>> On Wednesday 26 January 2011 23:51:18, Michael Litchard wrote:
>> > 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.
>> > >
>> > >
>> > > obtainCookies :: IO Curl -> String -> IO ()
>> > > obtainCookies curl responseBody = do
>> > >               curl' <- curl
>> > >               let collectedResources = screenScraping responseBody
>> > >                   in mapM ( curlResp curl' resourceOpts)
>> >
>> > collectedResources
>> >
>>
>> Looks like you need a flip here:
>>
>>           in mapM (flip (curlResp curl') resourceOpts) collectedResources
>>
>> > >               return ()
>>
>> If you're throwing away the results of the MapM'ed actions, use mapM_
>>
>> obtainCookies curl responseBody = do
>>    curl' <- curl
>>     mapM_ (flip (curlResp curl') resourceOpts) $
>>          screenScraping responseBody
>>
>> >
>> > 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?
>>
>> Use mapM_
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://www.haskell.org/pipermail/beginners/attachments/20110126/f31a3b83/attachment-0001.htm>

------------------------------

Message: 3
Date: Thu, 27 Jan 2011 01:20:07 +0100
From: Daniel Fischer <[email protected]>
Subject: Re: [Haskell-beginners] Trying to use map
To: Michael Litchard <[email protected]>
Cc: [email protected]
Message-ID: <[email protected]>
Content-Type: text/plain;  charset="utf-8"

On Thursday 27 January 2011 00:36:57, Michael Litchard wrote:
> google hosed my indentation
>
> > obtainCookies :: IO Curl -> String -> IO ()
> > obtainCookies curl responseBody = do
> >               curl' <- curl
> >               mapM_ (flip (curlResp curl') resourceOpts) $
> >                     screenScraping responseBody
>
> On Wed, Jan 26, 2011 at 3:32 PM, Michael Litchard 
<[email protected]>wrote:
> > Thank you.
> >
> > Here is where things stand now
> >
> > > obtainCookies :: IO Curl -> String -> IO ()
> > > obtainCookies curl responseBody = do
> > > curl' <- curl
> > > mapM_ (flip (curlResp curl') resourceOpts) $
> > >
> > > screenScraping responseBody
> >
> > and the error
> >
> > htmlParsing.lhs:78:2:
> >
> > Couldn't match expected type `[Char]'
> > against inferred type `GHC.IO.Exception.IOException'
> > Expected type: String
> >
> > Inferred type: IOError
> > When using functional dependencies to combine
> > MonadError IOError IO,
> > arising from the dependency `m -> e'
> > in the instance declaration at <no location info>
> > MonadError String IO,
> >
> > arising from a use of `curlResp' at HtmlParsing.lhs:80:29-42
> > When generalising the type(s) for `obtainCookies'

You have real problems now.
The MonadError Class has a functional dependency, and there's the

instance MonadError IOException IO where ...

In curlResp, you give the constraint (MonadError String m, MonadIO m), so 
by the functional dependency, m can't be IO.

I see two possibilities

a) modify curlResp,

curlResp :: (Error e, MonadError e 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 $ strMsg $ "Error: " ++ show code ++ " -- " ++ show 
status
? ? ?else return $ respBody resp

IOException is an instance of Error, as is String, so this is more general 
than the previous. You can't directly throw the error string, you have to 
pass it to strMsg before throwing.
That's not much of a change, if possible, I'd do that.

b) make a newtype wrapper IOS around IO, provide a MonadIO instance for 
that and an instance MonadError String IOS, then change obtainCookies (and 
what needs to be changed thereafter, such changes tend to propagate):

obtainCookies :: IO Curl -> String -> IOS ()
obtainCookies curl responseBody = do
               curl' <- liftIO curl
               mapM_ (flip (curlResp curl') resourceOpts) $
                     screenScraping responseBody

> >
> > I'm way beyond my ken here, trying to grow. I have to do error
> > handling (this will be production code when it grows up), got some
> > suggestions on how to do so, but am flying blind in new territory.
> >
> > Any suggestions on how to proceed would be much appreciated.
> >



------------------------------

_______________________________________________
Beginners mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/beginners


End of Beginners Digest, Vol 31, Issue 34
*****************************************

Reply via email to