On Dec 21, 2007 12:47 PM, Nicholls, Mark &lt;<a href="mailto:Nicholls.Mark@mtvne.com">Nicholls.Mark@mtvne.com</a>&gt; wrote:<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;">











<div link="blue" vlink="blue" lang="EN-GB">

<div>

<p><font color="navy" face="Arial" size="2"><span style="font-size: 10pt; font-family: Arial; color: navy;">Let me resend the code…as it stands….</span></font></p><div class="Ih2E3d">

<p><font color="navy" face="Arial" size="2"><span style="font-size: 10pt; font-family: Arial; color: navy;">&nbsp;</span></font></p>

<p style=""><b><font color="#0000c4" face="Courier New" size="2"><span style="font-size: 10pt; color: rgb(0, 0, 196); font-weight: bold;">module</span></font></b><font color="black" face="Courier New" size="2"><span style="font-size: 10pt; color: black;">
 Main </span></font><b><font color="#0000c4" face="Courier New" size="2"><span style="font-size: 10pt; color: rgb(0, 0, 196); font-weight: bold;">where</span></font></b><font face="Courier New" size="2"><span style="font-size: 10pt;">
</span></font></p>

<p style=""><font face="Courier New" size="2"><span style="font-size: 10pt;">&nbsp;</span></font></p>

<p style=""><b><font color="#0000c4" face="Courier New" size="2"><span style="font-size: 10pt; color: rgb(0, 0, 196); font-weight: bold;">data</span></font></b><font color="black" face="Courier New" size="2"><span style="font-size: 10pt; color: black;">
 SquareType numberType = Num numberType =&gt; SquareConstructor
numberType</span></font><font face="Courier New" size="2"><span style="font-size: 10pt;"></span></font></p>

<p style=""><font face="Courier New" size="2"><span style="font-size: 10pt;">&nbsp;</span></font></p></div>

<p style=""><b><font color="#0000c4" face="Courier New" size="2"><span style="font-size: 10pt; color: rgb(0, 0, 196); font-weight: bold;">class</span></font></b><font color="black" face="Courier New" size="2"><span style="font-size: 10pt; color: black;">
 ShapeInterface shape </span></font><b><font color="#0000c4" face="Courier New" size="2"><span style="font-size: 10pt; color: rgb(0, 0, 196); font-weight: bold;">where</span></font></b><font face="Courier New" size="2"><span style="font-size: 10pt;">
</span></font></p>

<p style=""><font color="black" face="Courier New" size="2"><span style="font-size: 10pt; color: black;">&nbsp; &nbsp;&nbsp;&nbsp; area :: Num numberType =&gt; shape</span></font><b><font color="#0000c4" face="Courier New" size="2"><span style="font-size: 10pt; color: rgb(0, 0, 196); font-weight: bold;">
-&gt;</span></font></b><font color="black" face="Courier New" size="2"><span style="font-size: 10pt; color: black;">numberType</span></font><font face="Courier New" size="2"><span style="font-size: 10pt;"></span></font></p>
<div class="Ih2E3d">

<p style=""><font face="Courier New" size="2"><span style="font-size: 10pt;">&nbsp;</span></font></p>

<p style=""><b><font color="#0000c4" face="Courier New" size="2"><span style="font-size: 10pt; color: rgb(0, 0, 196); font-weight: bold;">data</span></font></b><font color="black" face="Courier New" size="2"><span style="font-size: 10pt; color: black;">
 ShapeType = forall a. ShapeInterface a =&gt; ShapeType a</span></font><font face="Courier New" size="2"><span style="font-size: 10pt;"></span></font></p>

<p style=""><font face="Courier New" size="2"><span style="font-size: 10pt;">&nbsp;</span></font></p></div><div class="Ih2E3d">

<p style=""><b><font color="#0000c4" face="Courier New" size="2"><span style="font-size: 10pt; color: rgb(0, 0, 196); font-weight: bold;">instance</span></font></b><font color="black" face="Courier New" size="2"><span style="font-size: 10pt; color: black;">
 (Num a) =&gt; ShapeInterface (SquareType a) </span></font><b><font color="#0000c4" face="Courier New" size="2"><span style="font-size: 10pt; color: rgb(0, 0, 196); font-weight: bold;">where</span></font></b><font color="black" face="Courier New" size="2">
<span style="font-size: 10pt; color: black;"> </span></font><font face="Courier New" size="2"><span style="font-size: 10pt;"></span></font></p>

<p style=""><font color="black" face="Courier New" size="2"><span style="font-size: 10pt; color: black;">&nbsp;&nbsp;&nbsp; area (SquareConstructor side) = side * side</span></font>&nbsp;<br></p></div></div></div></blockquote><div>Part of the problem is that GHC&#39;s error messages have to account for a lot of complex typing extensions you aren&#39;t using, so they aren&#39;t clear. I&#39;ll try to explain what&#39;s going wrong.
<br><br>If you look at the function,<br><br>area (SquareConstructor side) = side * side<br><br>in isolation (that is, not as part of the class instance), it has the type &quot;forall a. Num a =&gt; SquareConstructor a -&gt; a&quot;.
<br><br>The function in the class declaration has type &quot;forall a b. (ShapeInterface a, Num b) =&gt; a -&gt; b&quot;. The problem is that a and b are independent variables, but the instance declaration for SquareType a requires them to be related.
<br><br>I&#39;m not sure which way you were trying to parameterize things, but here are some possibilities:<br><br>(1) If every shape type is parameteric, then you can make ShapeInterface a class of type constructors.<br>
<br>&nbsp;&nbsp;&nbsp; class ShapeInterface shape where<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; area :: Num a =&gt; shape a -&gt; a<br><br>&nbsp;&nbsp;&nbsp; instance ShapeInterface SquareType where<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; area (SquareConstructor side) = side * side<br><br>(2) If only some shape types are parametric, you can use a multi-parameter type class to express a relationship between the shape type and the area type:
<br><br>&nbsp;&nbsp;&nbsp; class ShapeInterface shape area where<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; area :: shape -&gt; area<br><br>&nbsp;&nbsp;&nbsp; instance (Num a) =&gt; ShapeInterface (SquareType a) a where<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; area (SquareConstructor side) = side * side<br><br>(3) If you only need to be parameteric over some subset of numeric types, you can use conversion functions:
<br><br>&nbsp;&nbsp;&nbsp; class ShapeIterface shape where<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; area :: shape -&gt; Rational<br><br>&nbsp;&nbsp;&nbsp; class (Real a) =&gt; ShapeInterface (SquareType a) where<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; area (SquareConstructor side) = toRational (side * side)<br>
<br>(Equivalently, you can replace Rational and Real with Integer and Integral.)<br><br></div></div>It may be that none of these are what you want. There are other, more complex possibilities, but I expect they&#39;re overkill.
<br clear="all"><br>-- <br>Dave Menendez &lt;<a href="mailto:dave@zednenem.com">dave@zednenem.com</a>&gt;<br>&lt;<a href="http://www.eyrie.org/~zednenem/">http://www.eyrie.org/~zednenem/</a>&gt;