title: Redefine list monad instance
body: <p>I'd like to supply my own instance for the list monad. Unfortunately, the following causes a duplicate instance declaration error when compiling.</p>
  
  <pre><code>myReturn :: a -&gt; [a]
  myBind :: [a] -&gt; (a -&gt; [b]) -&gt; [b]
  instance Monad [] where
      return = myReturn
      (&gt;&gt;=) = myBind
  </code></pre>
  
  <p>From the documentation, it seems like it's not possible to hide instance declarations when importing, and since the list monad instance is already declared in the prelude, I guess I can't get rid of the import itself either.</p>
  
  <p>I figured that maybe I could at least rebind <code>(&gt;&gt;=)</code> and <code>return</code> so that I would be able to use do blocks using my own implementation since do blocks are supposedly just syntactic sugar for applications of <code>(&gt;&gt;=)</code> and <code>(&gt;&gt;)</code>.</p>
  
  <pre><code>let
      return = myReturn
      (&gt;&gt;=) = myBind
  in
      do
          item1 &lt;- list1
          item2 &lt;- list2
          return (item1, item2)
  </code></pre>
  
  <p>Unfortunately, it seems like do blocks get their <code>(&gt;&gt;=)</code> from somewhere else, because it's still using the <code>(&gt;&gt;=)</code> of the default list monad instance.</p>
  
  <p>Is there any way to make my implementations of <code>(&gt;&gt;=)</code> and <code>return</code> an instance of list monad, or at least a way to use them with do blocks?</p>