
On Thu, Jan 1, 2009 at 1:31 PM, David Menendez
2009/1/1 Luke Palmer
: So that's the answer: there already is a Strict monad. And an attempt to make a lazier one strict just results in breaking the monad laws.
There is at least one transformer that will make a strict monad out of a non-strict monad.
newtype CPS m a = CPS { unCPS :: forall b. (a -> m b) -> m b }
I have heard this called the "codensity monad" (and it appears under that name in category-extras). Good observation. In my reply I missed the important consideration of the strictness of (>>=), irrsepective of the values. While you can not force values to be strict in a monad without breaking a law, (>>=) is "up for grabs", and that's what people are referring to when they refer to strict and lazy monads. So I guess "strict monad" means (>>= f) is strict for all f. Right? Luke
There's another answer though, regarding your question for why we don't just use StrictT State instead of a separate State.Strict. This message is already too long, and I suspect this will be the popular reply anyway, but the short answer is that Strict State is called that because it is strict in its state, not in its value.
No, Control.Monad.State.Strict and Control.Monad.State.Lazy never force evaluation of their states.
Control.Monad.State.Strict> evalState (put undefined) '0' ()
My mistake. Luke