On Sun, Oct 18, 2009 at 9:45 PM, Michael Snoyman <mich...@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 Regards, -- Nicolas Pouillard http://nicolaspouillard.fr _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe