
On Sun, Oct 18, 2009 at 9:45 PM, Michael Snoyman
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 Regards, -- Nicolas Pouillard http://nicolaspouillard.fr