
On 2/5/07, Yitzchak Gale
J. Garrett Morris wrote:
Mainly to keep the type error messages simpler.
There are two ways to get around that problem:
1. Make your functions polymorphic, using MonadState, MonadError, etc. Each function mentions only the capabilities that it needs, without having the whole monad stack in its type.
Again, from the earlier example, I'm not sure how typing: apply :: (MonadCont m, MonadState Blargh m, MonadError Fzzt m, MonadIO m) => Handle -> Attribute a -> m a is simpler than apply :: Handle -> Attribute a -> m a especially when almost every function in the project would have required the same constraint list.
2. Use a type alias for the monad stack.
At least as of 6.4.2, GHC printed the expanded types, not the aliases, in error messages.
(There are other big advantages of both of these.)
Those being? /g -- It is myself I have never met, whose face is pasted on the underside of my mind.