<html><head></head><body bgcolor="#FFFFFF"><div>Fair enough.</div><div><br></div><div>So if I understand you correctly, () is becoming more overloaded as to its kind?&nbsp;</div><div><br></div><div>Right now it seems it is either * or Constraint depending on context.&nbsp;</div><div><br></div><div>As I understand you, fixing this seems to indicate that () could have any '<span class="Apple-style-span" style="-webkit-tap-highlight-color: rgba(26, 26, 26, 0.292969); -webkit-composition-fill-color: rgba(175, 192, 227, 0.230469); -webkit-composition-frame-color: rgba(77, 128, 180, 0.230469); ">a -&gt; Constraint' kind as well.</span></div><div><br></div><div>This raises similar questions about (,) and how to build 'a -&gt; Constraint' products nicely.</div><div><br>Sent from my iPad</div><div><br>On Dec 23, 2011, at 4:42 AM, Simon Peyton-Jones &lt;<a href="mailto:simonpj@microsoft.com">simonpj@microsoft.com</a>&gt; wrote:<br><br></div><div></div><blockquote type="cite"><div>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->


<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">it’s a bug.&nbsp; I’m fixing it.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D"><br>
Simon<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D"><o:p>&nbsp;</o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt">
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> <a href="mailto:glasgow-haskell-users-bounces@haskell.org">glasgow-haskell-users-bounces@haskell.org</a> [mailto:glasgow-haskell-users-bounces@haskell.org]
<b>On Behalf Of </b>Edward Kmett<br>
<b>Sent:</b> 22 December 2011 17:03<br>
<b>To:</b> Bas van Dijk<br>
<b>Cc:</b> <a href="mailto:glasgow-haskell-users@haskell.org">glasgow-haskell-users@haskell.org</a><br>
<b>Subject:</b> Re: ConstraintKinds and default associated empty constraints<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<div>
<p class="MsoNormal">On Wed, Dec 21, 2011 at 6:45 PM, Bas van Dijk &lt;<a href="mailto:v.dijk.bas@gmail.com">v.dijk.bas@gmail.com</a>&gt; wrote:<o:p></o:p></p>
</div>
<div>
<div>
<div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<p class="MsoNormal" style="margin-bottom:12.0pt">I'm playing a bit with the new ConstraintKinds feature in GHC<br>
7.4.1-rc1. I'm trying to give the Functor class an associated<br>
constraint so that we can make Set an instance of Functor. The<br>
following code works but I wonder if the trick with: class Empty a;<br>
instance Empty a, is the recommended way to do this:<br>
<br>
{-# LANGUAGE ConstraintKinds, TypeFamilies, FlexibleInstances #-}<br>
<br>
import GHC.Prim (Constraint)<br>
<br>
import Prelude hiding (Functor, fmap)<br>
<br>
import &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Data.Set (Set)<br>
import qualified Data.Set as S (map, fromList)<br>
<br>
class Functor f where<br>
&nbsp; &nbsp; type C f :: * -&gt; Constraint<br>
&nbsp; &nbsp; type C f = Empty<br>
<br>
&nbsp; &nbsp; fmap :: (C f a, C f b) =&gt; (a -&gt; b) -&gt; f a -&gt; f b<br>
<br>
class Empty a; instance Empty a<br>
<br>
instance Functor Set where<br>
&nbsp; &nbsp; type C Set = Ord<br>
&nbsp; &nbsp; fmap = S.map<br>
<br>
instance Functor [] where<br>
&nbsp; &nbsp; fmap = map<br>
<br>
testList = fmap (+1) [1,2,3]<br>
testSet &nbsp;= fmap (+1) (S.fromList [1,2,3])<br>
<br>
Cheers and thanks for a great new feature!<br>
<br>
Bas<o:p></o:p></p>
</blockquote>
<div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
<div>
<p class="MsoNormal">This is the same solution I wound up with in<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
<div>
<p class="MsoNormal"><a href="https://github.com/ekmett/constraints">https://github.com/ekmett/constraints</a>&nbsp;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
<div>
<p class="MsoNormal">Adding an argument to the family would work but is somewhat unsatisfying as it mucks with polymorphic recursive use of the dictionary, and with placing constraints on constraints, so I prefer to keep as few arguments as possible.<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
<div>
<p class="MsoNormal">You can go farther with Functor by using polymorphic kinds and indexing the source and destination Category as well as the class of objects in the category.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
<div>
<p class="MsoNormal">I should probably write up what I've done with this, but doing so lets you have real product and coproduct Category instances, which were previously not possible (a fact which in part drove me to write all the semigroupoid code i have on
 hackage.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
<div>
<p class="MsoNormal">-Edward<o:p></o:p></p>
</div>
</div>
</div>
</div>
</div>
</div>


</div></blockquote></body></html>