<div><span class="gmail_quote">On 12/5/07, <b class="gmail_sendername">Ben Franksen</b> &lt;<a href="mailto:ben.franksen@online.de">ben.franksen@online.de</a>&gt; wrote:</span>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">data Command = Skip<br><br>class Java block command where<br>block_ :: [command] -&gt; block<br><br>compBlock :: [Command] -&gt; block
<br>--compBlock = block_ . map compCommand<br><br>compCommand :: Command -&gt; command<br><br>This compiles ok. But when I ask ghci for the type of the body of the<br>default definition of compBlock I get<br><br>*Main&gt; :t block_ . map compCommand
<br>block_ . map compCommand :: forall block block1 command.<br>(Java block command, Java block1 command) =&gt;<br>[Command] -&gt; block</blockquote>
<div>&nbsp;</div>
<div>Lets look at the type of &quot;compCommand&quot;.</div>
<div>&nbsp;</div>
<div>compCommand :: Java block command =&gt; Command -&gt; command</div>
<div>&nbsp;</div>
<div>The block type is not used at all in this declaration, but the block type can influence which implementation &quot;compCommand&quot; is chosen.&nbsp; This means&nbsp;that it&#39;s actually almost impossible to ever call this&nbsp;function, as given a type for &nbsp;&quot;command&quot; there could be multiple implementations of &quot;Java block command&quot; for different block types, and there&#39;s no way to ever&nbsp;determine which function to call&nbsp;unless the&nbsp;instance declaration admits any type.
</div>
<div>
<p>{-# OPTIONS_GHC -fglasgow-exts #-}<br>module BrokenTypeClass where</p>
<p>class Broken a b where<br>&nbsp;&nbsp;&nbsp; broken :: String -&gt; b</p>
<p>{-<br>instance Broken Bool String where<br>&nbsp;&nbsp;&nbsp; broken = id</p>
<p>instance Broken String String where<br>&nbsp;&nbsp;&nbsp; broken = reverse<br>-} -- which instance of &quot;broken&quot; do you choose in &quot;test&quot; below?</p>
<p>instance Broken a String where<br>&nbsp;&nbsp;&nbsp; broken = id</p>
<p>test :: String<br>test = broken &quot;hello&quot;</p></div>
<div>You would have to use functional dependencies or associated types to eliminate this error.&nbsp; Alternatively, you can add a dummy argument of type &quot;block&quot; and pass&nbsp;&quot;undefined :: BlockType&quot; in to help choose the instance declaration.
</div>
<div>&nbsp;</div>
<div>Still, I agree with Brent here; whenever I have written code like this I soon&nbsp;realize that I didn&#39;t need a typeclass in the first place, and I would have been better off not using them; they&#39;re not like&nbsp;OO classes.
</div>
<div>&nbsp;</div>
<div>&nbsp; -- ryan</div></div>