[Haskell-cafe] couple of questions on monads

Stephen Hicks sdh33 at cornell.edu
Mon Oct 13 18:16:12 EDT 2008

2008/10/13 Daryoush Mehrtash <dmehrtash at gmail.com>:
> Is there a write up on what makes an implementation lazy vs strict?

I would be interested in seeing this, too!

> I  like to better understand the trade off between the two and use cases
> where one is better than the other.
> I noticed that some functions in the lazy implementation uses "~" .    For
> example
> evalStateT :: (Monad m) => StateT s m a -> s -> m a
> evalStateT m s = do
>     ~(a, _) <- runStateT m s
>     return a
> What does ~ do?

Here's one I can answer.  ~ causes Haskell to do the pattern match
lazily.  Normally, when you write
  (a,_) <- runStateT m s
it eagerly evaluates the runStateT m s far enough to determine that
the result is in fact a tuple in the underlying monad (as opposed to,
say, fail).  Adding the ~ tells Haskell to not do any computation
until it actually needs the value of a.  You can find a better
explanation and examples at



More information about the Haskell-Cafe mailing list