<div class="gmail_quote">On Sun, Oct 3, 2010 at 9:40 PM, Michael Vanier <span dir="ltr">&lt;<a href="mailto:mvanier42@gmail.com">mvanier42@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
{- This doesn&#39;t work: -}<br>
newtype MyMonad a =<br>
  MyMonad ((StateT (MyData a) (Either SomeError) a))<br>
  deriving (Monad,<br>
            MonadState (MyData a),<br>
            MonadError SomeError,<br>
            Typeable)<br></blockquote><div><br></div><div>This simply isn&#39;t allowed by the generalised newtype derivation machinery, because the type variable &quot;a&quot; appears in one of the classes you&#39;re deriving.</div>
<div><br></div><div>In fact, I&#39;m not sure how you&#39;re hoping for your type to actually work as a monad. If you try using (&gt;&gt;=) on your type synonym that currently appears to typecheck, you&#39;ll find that the only value that can inhabit the state parameter is bottom. Try writing out and using a definition of (&gt;&gt;=) by hand to understand your confusion.</div>
</div>