[Haskell-cafe] better error expression in IO function

Andrew Coppin andrewcoppin at btinternet.com
Wed Jul 11 16:26:22 EDT 2007


brad clawsie wrote:
> i am working on improving a module for getting Yahoo Finance quote
> data, hopefully getting it to a point that i can put it on hackage
>
> in the quote retrieval function, there are a few places i would like
> to call out errors. in a trivial case i could return 
>
> IO (Maybe String) 
>
> with Nothing signifying any error state, or Just expressing the data
>
> but i would like to be able to express some of these error cases in a
> more structured manner
>
> i know the Either type can be used in such a case(?), but i've had some
> problem locating a satisfactory example (if this is indeed
> appropriate)
>
> could one of the vets here provide a simplistic example expressing
> error cases, preferrably in the IO Monad (in case there are any
> gotchas there)?
>   

It's fairly common to use the Either type for this. By convention, 
"Right" means "correct", and by elimination "Left" means an error...

  foo x = case x of
    .... return (Right y)
    .... return (Left "Some error happened")

Instead of just returning a text string indicating the error condition, 
you could devize your own special type for representing the possible 
errors that can happen.

You could also make a kind of a "Result" type that represents both 
successful *and* failed results, if you prefer.

In addition, in the IO monad, I believe you can do fun stuff with 
exceptions. Specifically, you can *catch* them. However, beware: Haskell 
has something of a habit of executing stuff at unpredictable times, 
which means that if you're throwing errors in pure code, it can be hard 
to register the exception handler(s) at the right time! Probably simpler 
and clearer to go with Either or something OTOH, if you're throwing 
errors from within the IO monad itself, timing should be less of an issue.

Just my few cents...



More information about the Haskell-Cafe mailing list