2009/4/2 Louis Wasserman <span dir="ltr">&lt;<a href="mailto:wasserman.louis@gmail.com">wasserman.louis@gmail.com</a>&gt;</span><br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
The following module does not compile, and I can&#39;t figure out why:<div><br></div><div><div>{-# LANGUAGE TypeFamilies #-}</div><div>{-# LANGUAGE KindSignatures #-}</div><div><br></div><div>module Foo where</div><div><br>


</div><div>import Control.Monad</div><div>import Data.Maybe</div><div><br></div><div>class Key k where</div><div><span style="white-space: pre;">        </span>type Map k :: * -&gt; *</div><div><span style="white-space: pre;">        </span>empty :: Map k v<br>


</div><div><span style="white-space: pre;">        </span>look :: k -&gt; Map k v  -&gt; Maybe v</div><div><span style="white-space: pre;">        </span>update :: k -&gt; (Maybe v -&gt; Maybe v) -&gt; Map k v -&gt; Map k v</div>

<div><br></div><div>instance (Key k1, Key k2) =&gt; Key (k1, k2) where</div><div><span style="white-space: pre;">        </span>type Map (k1, k2) v = Map k1 (Map k2 v)</div></div></blockquote><div><br>The arity of the instance has to be <i>exactly</i> the same as is declared.  So the v is one too many parameters.  That does make your life a little more difficult (but points to an abstraction you may not have seen :-).<br>
<br>I would resolve this as:<br><br>    type Map (k1,k2) = Map k1 `O` Map k2<br><br>Where O is functor composition from TypeCompose on hackage.<br><br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div><div></div><div><span style="white-space: pre;">        </span>empty = empty<br>

</div><div><span style="white-space: pre;">        </span>update (k1, k2) f = update k1 (update k2 f . fromMaybe empty)</div><div><span style="white-space: pre;">        </span>look (k1, k2) = look k1 &gt;=&gt; look k2</div>

<div><br></div><div>The compile fails with</div><div><div>Foo.hs:16:1:</div><div>    Number of parameters must match family declaration; expected 1</div><div>    In the type synonym instance declaration for `Map&#39;</div>


<div>    In the instance declaration for `Key (k1, k2)&#39;</div></div><div><br></div><div>Is this a bug with type synonym families? Is there something silly I&#39;m missing?</div><div><br></div>Louis Wasserman<br><a href="mailto:wasserman.louis@gmail.com" target="_blank">wasserman.louis@gmail.com</a><br>



</div>
<br>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br></blockquote></div><br>