On Thu, Jul 29, 2010 at 11:48 PM, Lyndon Maydwell <maydw...@gmail.com>wrote:

> You cannot break out of a monad if all you have available to use are
> the monad typeclass functions, however there is nothing preventing an
> instance from being created that allows escape. Many of these escape
> methods come in the form of runX functions, but you can use
> constructors to break out with pattern matching if they are exposed.
>

There is one case where you can break out of a monad without knowing which
monad it is.  Well, kind of.  It's cheating in a way because it does force
the use of the Identity monad.  Even if it's cheating, it's still very
clever and interesting.
http://okmij.org/ftp/Computation/lem.html

<http://okmij.org/ftp/Computation/lem.html>The specific function is:

     > purify :: (forall m. Monad m => ((a -> m b) -> m b)) -> ((a->b)->b)
     > purify f = \k -> runIdentity (f (return . k))

We take some arbitrary monad 'm' and escape from it.  Actually, the trick is
that f must work for ALL monads.  So we pick just one that allows escape and
apply f to it.  Here we picked Identity.  You could have picked Maybe,
lists, and any of the others that allow escaping.


> As far as I can tell, IO is more of an outlier in this regard.
>

Yes I agree there.  And even with IO we have unsafePerformIO that lets you
escape.

Jason
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to