Hi Brent,<br><br>I&#39;m sorry to hear that the non-injectivity issue bit you.  It&#39;s bitten 
me also at times, leading me to choose associated data types (injective)
 instead of associated synonyms (potentially non-injective).  And 
sometimes,  the data types route is problematic, as the new types aren&#39;t
 instances (and I don&#39;t know how to declare them to be) of other classes when I need them to be.  MemoTrie &amp; vector-space seem to 
trip over these issues, and I thought I&#39;d lucked into a combo that 
worked, but from your note I guess I just hadn&#39;t pushed far enough to 
uncover difficulties.<br><br>I&#39;m unsure now, but I think I tried making 
Basis a data type (not syn) and ran into the problem I mentioned above.  The Basis *synonyms* also have HasTrie instances, which is crucially important.  If we switch to (injective) data types, then we lose the HasTrie instances.  I&#39;d be okay with defining HasTrie instances (preferably via &quot;deriving&quot;) for the associated Basis data types, but I couldn&#39;t figure out how to.  Maybe it&#39;s not possible currently, or maybe I just didn&#39;t know how.<br>

<br>I&#39;d love to have help exploring these issues more widely &amp; deeply, as they do seem to fatally wound the usefulness of associated data types.<br><br>   - Conal<br><br><br><div class="gmail_quote">On Wed, Apr 14, 2010 at 8:01 AM, Brent Yorgey <span dir="ltr">&lt;<a href="mailto:byorgey@seas.upenn.edu">byorgey@seas.upenn.edu</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div class="im">On Thu, Apr 15, 2010 at 12:48:20AM +1000, Roman Leshchinskiy wrote:<br>
&gt;<br>
&gt; &gt;<br>
&gt; &gt; Right, this seems weird to me.  Why is there still a &#39;u&#39; mentioned in<br>
&gt; &gt; the constraints?  Actually, I don&#39;t even see why there ought to be<br>
&gt; &gt; both v and v1.  The type of (*.*) mentions three type variables, u, v, and w:<br>
&gt; &gt;<br>
&gt; &gt; (*.*)  :: (HasBasis  u, HasTrie  (Basis  u),<br>
&gt; &gt;           HasBasis  v, HasTrie  (Basis  v),<br>
&gt; &gt;           VectorSpace  w,<br>
&gt; &gt;           Scalar  v ~ Scalar  w)<br>
&gt; &gt;       =&gt; (v :-*  w) -&gt; (u :-*  v) -&gt; u :-*  w<br>
&gt;<br>
&gt; Note that (:-*) is a type synonym:<br>
&gt;<br>
&gt; type :-* u v = MSum (Basis u :-&gt;: v)<br>
<br>
</div>Aha!  That&#39;s what I was missing.  Thanks for the insight, Roman.  I<br>
guess it&#39;s time to go bug Conal... =)<br>
<font color="#888888"><br>
-Brent<br>
</font><div><div></div><div class="h5">_______________________________________________<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>
</div></div></blockquote></div><br>