On Tue, Sep 7, 2010 at 2:45 PM, Dimitry Golubovsky <golubov...@gmail.com> wrote:
> unThrow a = unsafePerformIO $ (E.evaluate a >>= return . Right) `E.catch`
>                                               (\e -> return $ Left e)
>
> -- or perhaps the right argument of catch could be just (return . Left)?
>
> bm2mb :: a -> Maybe a
>
> bm2mb a = case unThrow a of
>   Left (e::SomeException) -> Nothing
>   Right a -> Just a

Philosophically these functions are Nasty because they violate
referential transparency. In particular it's possible for the same
expression to throw different exceptions each time it's run depending
on how it's optimised, what other threads are doing, if the user
presses ctrl-C, etc. etc.
See the spoon package:

http://hackage.haskell.org/package/spoon

which alleviates this a little by only catching some kinds of
exception, and not telling you which it caught. It still violates
monotonicity (I believe), so purists will be upset, but practically it
can be useful for when editing the source code to provide explicit
exceptions (which is ideally what you'd do) is not an option.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to