title: Linking/Combining Type Classes in Haskell
body: <p>Say I have two type classes defined as follows that are identical in function but different in names:</p>
  
  <pre><code>class Monad m where
      (&gt;&gt;=)  :: m a -&gt; (a -&gt; m b) -&gt; m b
      return :: a -&gt; m a
  
  class PhantomMonad p where
      pbind    :: p a -&gt; (a -&gt; p b) -&gt; p b
      preturn  :: a -&gt; p a
  </code></pre>
  
  <p>Is there a way to tie these two classes together so something that is an instance of PhantomMonad will automatically be an instance of Monad, or will instances for each class have to be explicitly written?  Any insight would be most appreciated, thanks!</p>