
On Thu, Jul 29, 2010 at 11:48 PM, Lyndon Maydwell
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.htmlThe 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