<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Thank you! &nbsp;I agree that what I'm doing isn't useful from an application perspective, but this turned out to be very useful for comprehension.<div><br></div><div>It was the&nbsp;<div><br></div><div><font class="Apple-style-span" face="'Courier New'">rad :: a b -&gt; b</font></div><div><br></div><div>that I was missing. &nbsp;Two type variables-- one for Angle and one for Float. &nbsp;This now compiles just fine:</div><div><br></div><div><div><font class="Apple-style-span" face="'Courier New'">data Angle a = Radians a</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | Degrees a</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; deriving (Eq, Show)</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">class Angular a where</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp;rad :: (Floating b) =&gt; a b -&gt; b</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp;rad x = pi * (deg x) / 180</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp;deg :: (Floating b) =&gt; a b -&gt; b</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp;deg x = 180 * (rad x) / pi</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">instance Angular Angle where</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp; &nbsp;rad (Radians x) = x</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp; &nbsp;deg (Degrees x) = x&nbsp;</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">x :: Angle Float</font></div><div><font class="Apple-style-span" face="'Courier New'">x = Radians (pi / 2)</font></div><div><br></div></div><div><font class="Apple-style-span" face="'Courier New'">y :: Float</font></div><div><font class="Apple-style-span" face="'Courier New'">y &nbsp;= deg x</font></div><div><br></div><div>It just doesn't execute, because of a non-exhaustive pattern for <font class="Apple-style-span" face="'Courier New'">deg</font>. &nbsp;I guess that makes sense-- the default functions are per type, not per value constructor...</div><div><br></div><div>Changing my instance definition to this:</div><div><br></div><div><div><font class="Apple-style-span" face="'Courier New'">instance Angular Angle where</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp; &nbsp;rad (Radians x) = x</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp; &nbsp;rad (Degrees x) = pi * x / 180</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp; &nbsp;deg (Radians x) = 180 * x / pi</font></div><div><font class="Apple-style-span" face="'Courier New'">&nbsp;&nbsp; &nbsp;deg (Degrees x) = x&nbsp;</font></div></div><div><br></div><div>resolves the problem.</div><div><br></div><div>Thanks again for the help. &nbsp;I'm now that much further down the type system learning curve...</div><div><br></div><div>Cheers--</div><div>&nbsp;Greg</div><div><br></div><div><br><div><div>On Aug 23, 2010, at 8:06 PM, Tobias Brandt wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">You don't need a type class, you can just define your functions with pattern matching:<div><br></div><div><font class="Apple-style-span" face="'courier new', monospace">rad :: Angle a -&gt; a</font></div><div><font class="Apple-style-span" face="'courier new', monospace">rad (Radians x) = x</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace">rad (Degrees x) =&nbsp;</font><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace">pi * (deg x) / 180</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace"><br></font></span></div><div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace">deg :: Angle a -&gt; a</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace">deg (Radians x) =&nbsp;</font></span><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace">180 * (rad x) / pi</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace">deg (Degrees x) = x</font></span></div><div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace"><br>
</font></span></div><div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="arial, helvetica, sans-serif">Alternatively, you can define Radians and Degrees as separate types and use a type class:</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="arial, helvetica, sans-serif"><br></font></span></div><div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace">data Radians a = Radians a</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace">data Degrees a = Degrees a</font></span></div><div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace"><br>
</font></span></div><div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace">class Angular a where</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace">&nbsp;&nbsp; &nbsp;rad :: a b -&gt; b</font></span></div><div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace">&nbsp;&nbsp; &nbsp;deg :: a b -&gt; b</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace"><br></font></span></div><div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace">instance Angular Radians where</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace">&nbsp;&nbsp; &nbsp;rad (Radians x) = x</font></span></div><div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace">&nbsp;&nbsp; &nbsp;deg (Radians x) =&nbsp;</font></span><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace">180 * (rad x) / pi</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace"><br></font></span></div><div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-style-span" style="border-collapse: separate; font-size: small; "><div style="font-family: arial; ">
<span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace">instance Angular Degrees where</font></span></div><div style="font-family: arial; ">
<span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace">&nbsp;&nbsp; &nbsp;rad (Degrees x) =&nbsp;</font></span><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; border-collapse: collapse; ">pi * (deg x) / 180</span></div>
<div style="font-family: arial; "><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace">&nbsp;&nbsp; &nbsp;deg (Degrees x) =&nbsp;</font></span><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace">x</font></span></div>
<div style="font-family: arial; "><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="'courier new', monospace"><br></font></span></div><div><span class="Apple-style-span" style="font-size: 12px; border-collapse: collapse; "><font class="Apple-style-span" face="arial, helvetica, sans-serif">This would be extensible, but it this case not really useful.</font></span></div>
</span></font></span></div><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta http-equiv="content-type" content="text/html; charset=utf-8">
</blockquote></div><br></div></div></body></html>