[Haskell-cafe] Error handling package

Nicolas Pouillard nicolas.pouillard at gmail.com
Tue Oct 20 05:04:17 EDT 2009

On Sun, Oct 18, 2009 at 9:45 PM, Michael Snoyman <michael at snoyman.com> wrote:
> While working on the next release of data-object, I wanted to represent some
> operations that might fail. The typical candidates were:
> 1) Maybe
> 2) Either
> 3) Monad
> Monad is always iffy because of the often times poorly defined fail. Maybe
> doesn't provide any means of reporting what the problem was. Either is not
> defined as a Monad in the base library. Also, the usual candidate of Either
> String only provides for an error message. It would be nice to have more
> in-depth information available.
> So I've put together a package I call "attempt". It defines a data type
> called (surprise) Attempt with a Success and Failure constructor. The trick
> here is that it using the new extensible exceptions under the surface, so
> you can report any kind of exception you want. It also provides a
> "FromAttempt" type class for possible conversion targets from an Attempt,
> provides an attempt function with some helpers for performing the equivalent
> of Control.Exception.catches, and provides two samples of functions I would
> want to implement with this library: attemptJoin and attemptLookup.
> My questions for the list are:
> 1) Is the overall approach sound, or do people have better ideas?

I think that there is a place for such a package. Given the Monad/fail issue,
the Maybe/no-message issue and the Either/not-a-monad-in-base issue.

About the name Attempt, I think that 'Outcome' would be a better name.

> 2) Are there any other FromAttempt instances I should provide out of the
> box?

None that I see.

> 3) I was considering adding specialized versions of the fromAttempt
> function, ie ioFromAttempt, maybeFromAttempt. Thoughts?

It is a bit long to spell.

> 4) Should I follow the naming scheme attemptJoin, attemptLookup, etc, or
> just call the functions join, lookup and force people to import the module
> qualified?

A nice alternative would be to make a Data.Attempt.Extra (or a better
name) which
would be imported qualified.

> 5) Any other suggestions for attempt functions? I've considered
> head/tail/etc.

Why not, maybe the 'safe' package should be of some inspiration.

> 6) Include ToAttempt?

IMHO, no.

> The code is available on github at

I think that the 'attempt' function should follow functions like
'maybe' and 'either'.

attempt :: (forall e. Exception e -> b) -> (a -> b) -> Attempt a -> b


Nicolas Pouillard

More information about the Haskell-Cafe mailing list