I propose that we move the contents of Control.Monad.Instances into GHC.Base where they will be picked up and distributed by the Prelude.<div><br></div><div>Discussion deadline: 2 weeks from now (November 24)</div><div><br>
</div><div>== Current State ==</div><div><br></div><div>Control.Monad.Instances is currently the canonical source for the following orphan instances, which involve prelude types, but which were not thought of at the time Haskell 98 was written.</div>
<div><pre><span class="hs-keyword" style="color: blue; ">instance</span> <span class="hs-conid">Functor</span> <span class="hs-layout" style="color: red; ">(</span><span class="hs-layout" style="color: red; ">(</span><span class="hs-keyglyph" style="color: red; ">-&gt;</span><span class="hs-layout" style="color: red; ">)</span> <span class="hs-varid">r</span><span class="hs-layout" style="color: red; ">)</span> <span class="hs-keyword" style="color: blue; ">where</span>
<a name="line-21"></a>        <span class="hs-varid">fmap</span> <span class="hs-keyglyph" style="color: red; ">=</span> <span class="hs-layout" style="color: red; ">(</span><span class="hs-varop">.</span><span class="hs-layout" style="color: red; ">)</span>
<a name="line-22"></a>
<a name="line-23"></a><span class="hs-keyword" style="color: blue; ">instance</span> <span class="hs-conid">Monad</span> <span class="hs-layout" style="color: red; ">(</span><span class="hs-layout" style="color: red; ">(</span><span class="hs-keyglyph" style="color: red; ">-&gt;</span><span class="hs-layout" style="color: red; ">)</span> <span class="hs-varid">r</span><span class="hs-layout" style="color: red; ">)</span> <span class="hs-keyword" style="color: blue; ">where</span>
<a name="line-24"></a>        <span class="hs-varid">return</span> <span class="hs-keyglyph" style="color: red; ">=</span> <span class="hs-varid">const</span>
<a name="line-25"></a>        <span class="hs-varid">f</span> <span class="hs-varop">&gt;&gt;=</span> <span class="hs-varid">k</span> <span class="hs-keyglyph" style="color: red; ">=</span> <span class="hs-keyglyph" style="color: red; ">\</span> <span class="hs-varid">r</span> <span class="hs-keyglyph" style="color: red; ">-&gt;</span> <span class="hs-varid">k</span> <span class="hs-layout" style="color: red; ">(</span><span class="hs-varid">f</span> <span class="hs-varid">r</span><span class="hs-layout" style="color: red; ">)</span> <span class="hs-varid">r</span>
<a name="line-26"></a>
<a name="line-27"></a><span class="hs-keyword" style="color: blue; ">instance</span> <span class="hs-conid">Functor</span> <span class="hs-layout" style="color: red; ">(</span><span class="hs-conid">(,)</span> <span class="hs-varid">a</span><span class="hs-layout" style="color: red; ">)</span> <span class="hs-keyword" style="color: blue; ">where</span>
<a name="line-28"></a>        <span class="hs-varid">fmap</span> <span class="hs-varid">f</span> <span class="hs-layout" style="color: red; ">(</span><span class="hs-varid">x</span><span class="hs-layout" style="color: red; ">,</span><span class="hs-varid">y</span><span class="hs-layout" style="color: red; ">)</span> <span class="hs-keyglyph" style="color: red; ">=</span> <span class="hs-layout" style="color: red; ">(</span><span class="hs-varid">x</span><span class="hs-layout" style="color: red; ">,</span> <span class="hs-varid">f</span> <span class="hs-varid">y</span><span class="hs-layout" style="color: red; ">)</span>
<a name="line-29"></a>
<a name="line-30"></a><span class="hs-keyword" style="color: blue; ">instance</span> <span class="hs-conid">Functor</span> <span class="hs-layout" style="color: red; ">(</span><span class="hs-conid">Either</span> <span class="hs-varid">a</span><span class="hs-layout" style="color: red; ">)</span> <span class="hs-keyword" style="color: blue; ">where</span>
<a name="line-31"></a>        <span class="hs-varid">fmap</span> <span class="hs-keyword" style="color: blue; ">_</span> <span class="hs-layout" style="color: red; ">(</span><span class="hs-conid">Left</span> <span class="hs-varid">x</span><span class="hs-layout" style="color: red; ">)</span> <span class="hs-keyglyph" style="color: red; ">=</span> <span class="hs-conid">Left</span> <span class="hs-varid">x</span>
<a name="line-32"></a>        <span class="hs-varid">fmap</span> <span class="hs-varid">f</span> <span class="hs-layout" style="color: red; ">(</span><span class="hs-conid">Right</span> <span class="hs-varid">y</span><span class="hs-layout" style="color: red; ">)</span> <span class="hs-keyglyph" style="color: red; ">=</span> <span class="hs-conid">Right</span> <span class="hs-layout" style="color: red; ">(</span><span class="hs-varid">f</span> <span class="hs-varid">y</span><span class="hs-layout" style="color: red; ">)</span></pre>
</div><div><br></div><div>== The Issues ==</div><div><br></div><div>When using almost any library, you wind up transitively importing Control.Applicative, which imports Control.Monad.Instances and brings them into scope, so realistically any attempt the user might make to define his own version of these instances is doomed to failure and pain upon linking with the larger Haskell ecosystem.</div>
<div><br></div><div>== Proposed Enhancement ==</div><div><br></div><div>Control.Monad.Instances has been around for years, so experienced users have always had access to grab these but the main impact of hiding them in Control.Monad.Instances from a <a href="http://en.wikipedia.org/wiki/The_purpose_of_a_system_is_what_it_does">POSIWID</a> perspective is to confuse newbies.</div>
<div><br></div><div><span style="color: rgb(34, 34, 34); font-family: arial, sans-serif; font-size: 13px; background-color: rgba(255, 255, 255, 0.917969); ">The potential impact of just doing this right is less than the impact of changing Num, so I&#39;d say we should just do it, and make Control.Monad.Instances an empty stub that exists just to avoid breaking code, and which can be used to support any other missing instances for Prelude types in the future which _can&#39;t_ be merged such as the missing</span></div>
<div><pre><span class="hs-keyword" style="color: blue; ">instance</span> Monoid e =&gt; <span class="hs-conid">Monad</span> <span class="hs-layout" style="color: red; ">(</span>(,) e<span class="hs-layout" style="color: red; ">)</span> <span class="hs-keyword" style="color: blue; ">where</span>
<a name="line-24"></a>        <span class="hs-varid">return</span> a <span class="hs-keyglyph" style="color: red; ">=</span> <span style="color: red; ">(</span>a, mempty<span style="color: red; ">)</span></pre><pre>        <span style="color: red; ">(</span>w,a<span style="color: red; ">)</span> <span class="hs-varop">&gt;&gt;=</span> <span class="hs-varid">k</span> <span class="hs-keyglyph" style="color: red; ">=</span> <font color="#ff0000">(</font>mappend w w&#39;, b<span style="color: red; ">)</span></pre>
<pre><span class="hs-varid">            </span><span style="color: blue; ">where </span><span style="color: red; ">(</span>w&#39;,b<span style="color: red; ">) = </span>k a</pre></div><div>which I&#39;ll propose separately.</div>
<div><br></div><div>This would also let us be less careful about importing Control.Applicative in modules that get fed to the Prelude, which would be an important step in any eventual refactoring of the Monad class hierarchy to include Applicative anyways.</div>
<div><br></div><div><span style="color: rgb(34, 34, 34); font-family: arial, sans-serif; font-size: 13px; background-color: rgba(255, 255, 255, 0.917969); ">-Edward</span></div>