ns are provided via multi-parameter type classes
    and the result type is given by associated
    type families. For example:</p><pre>(+) :: (CanAddAsymmetric t1 t2) =&gt; t1 -&gt; t2 -&gt; AddType t1 t2</pre><p>The type constraint <code>CanAdd t1 t2</code> implies both
    <code>CanAddAsymmetric t1 t2</code> and <code>CanAddAsymmetric t2 t1</code>.</p><p>For convenience there are other aggregate type constraints such as
    <code>CanAddThis t1 t2</code>, which implies that the result is of type <code>t1<