
From: Alexey Khudyakov
On Fri, 30 Jul 2010 09:29:59 +0200 Stefan Holdermans
wrote: No I think here we breaking out from _arbitrary_ monad. If monadic function works for every monad then it must work for identity monad too. Here is simplest form of purify function:
purify2 :: (forall m . Monad m => m a) -> a purify2 m = runIdentity m
I wonder could this function be written without resorting to concrete monad
I don't find purify2 particularly helpful because I almost never want to break out of any arbitrary monad; I want to be able to break out of a specific monad without knowing which monad it is, that is: purify3 :: Monad m => m a -> a purify3 = undefined --the only possible definition... However, I just realized that something else is almost as good: evalCont :: Cont r a -> r evalCont k = runCont k id As Cont is the "Mother of all monads", it can be used to emulate the behavior of any other monad. If you had a library with instances of MonadReader, MonadWriter, MonadState, etc. (or operational equivalents) defined for the Cont monad, then you would have a purify function that works for all interesting monads (except IO, STM, and maybe ST), which is almost as good. John