<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
  <title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
What is wrong here? ghci tries (and fails) to deduce certain types for
the comp functions that I did not expect.<br>
<br>
<code>type Block&nbsp;&nbsp; = [Command]<br>
data Command = Skip | Assign String IntE | Cond BoolE Block Block |<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Loop BoolE Block<br>
data IntE&nbsp;&nbsp;&nbsp; = IntE Int | Var String | Sub IntE IntE | Sum [IntE] |
Prod [IntE]<br>
data BoolE&nbsp;&nbsp; = BoolE Bool | Greater IntE IntE | Not BoolE<br>
<br>
class Java block command intE boolE<br>
&nbsp;&nbsp; where block_ :: [command] -&gt; block<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; skip :: command<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;assign :: String -&gt; intE -&gt; command<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;cond :: boolE -&gt; block -&gt; block -&gt; command<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;loop :: boolE -&gt; block -&gt; command<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intE_ :: Int -&gt; intE<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var :: String -&gt; intE<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;sub :: intE -&gt; intE -&gt; intE<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;sum_ :: [intE] -&gt; intE<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;prod :: [intE] -&gt; intE<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolE_ :: Bool -&gt; boolE<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;greater :: intE -&gt; intE -&gt; boolE<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;not_ :: boolE -&gt; boolE<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;compBlock :: Block -&gt; block<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;compBlock = block_ . map compCommand<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;compCommand :: Command -&gt; command<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;compCommand Skip&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = skip<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;compCommand (Assign x e)&nbsp;&nbsp; = assign x (compIntE e)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;compCommand (Cond be c c') = cond (compBoolE be) (compCommand
c)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (compCommand
c')<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;compCommand (Loop be c)&nbsp;&nbsp;&nbsp; = loop (compBoolE be) (compCommand
c)-}<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;compIntE :: IntE -&gt; intE<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;compIntE (IntE i)&nbsp;&nbsp; = intE_ i<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;compIntE (Var x)&nbsp;&nbsp;&nbsp; = var x<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;compIntE (Sub e e') = sub (compIntE e) (compIntE e')<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;compIntE (Sum es)&nbsp;&nbsp; = sum_ (map compIntE es)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;compIntE (Prod es)&nbsp; = prod (map compIntE es)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;compBoolE :: BoolE -&gt; boolE<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;compBoolE (BoolE b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = boolE_ b<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;compBoolE (Greater e e') = greater (compIntE e) (compIntE e')<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;compBoolE (Not be)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = not_ (compBoolE be)<br>
</code><br>
</body>
</html>