<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1250">


<META content="MSHTML 6.00.2900.2963" name=GENERATOR></HEAD>
<BODY>
<DIV>
<DIV>
<DIV><SPAN class=789152913-14092006><FONT face=Arial size=2>Dear Haskell 
Cafe,</FONT></SPAN></DIV>
<DIV><FONT face=Arial size=2><SPAN 
class=789152913-14092006></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2><SPAN class=789152913-14092006><SPAN 
class=461004504-15092006>I have a problem I can't get my head around. 
</SPAN></SPAN></FONT><FONT face=Arial size=2><SPAN class=789152913-14092006>The 
code below sets the problem out.&nbsp; What I need to be able to do is commented 
out.</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2><SPAN 
class=789152913-14092006></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2><SPAN class=789152913-14092006>This code works, the 
only problem is that what I need is that an argument will be evaluated before it 
is passed,</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2><SPAN class=789152913-14092006>so ((and fries eats) 
eggs) has a single `eggs`&nbsp;(fries1 eggs2 and3 eats4 egg2) not (fries1 eggs2 
and3 eats4 eggs5).</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2><SPAN 
class=789152913-14092006></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2><SPAN class=789152913-14092006>The code that 
doesn't work is commented out at the bottom.&nbsp; I'm not sure the 
behaviour&nbsp; of ghc is correct, because </SPAN></FONT></DIV>
<DIV><FONT face=Arial><FONT size=2><SPAN class=789152913-14092006>when 
</SPAN><SPAN class=789152913-14092006>it typechecks it tries to unify `b = t t1` 
but `b` could actually be `t t1 -&gt; t t1`.</SPAN></FONT></FONT></DIV>
<DIV><FONT face=Arial size=2><SPAN 
class=789152913-14092006></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2><SPAN class=789152913-14092006>I want to be able to 
specify that when the first argument of `b` is of type `m a` that fork should 
run it and _then_</SPAN></FONT></DIV>
<DIV><SPAN class=789152913-14092006><FONT face=Arial><FONT size=2>fork the 
argument to the first two arguments of 'fork'.<SPAN 
class=774154313-14092006>&nbsp; The instance for (a -&gt; b) covers the rest of 
the possibilities.</SPAN></FONT></FONT></SPAN></DIV>
<DIV><FONT face=Arial size=2><SPAN 
class=789152913-14092006></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2><SPAN class=789152913-14092006><SPAN 
class=774154313-14092006>just type "run test[1-4]" to see 
results.</SPAN></SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2><SPAN class=789152913-14092006><SPAN 
class=774154313-14092006></SPAN></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2><SPAN 
class=789152913-14092006>\begin{code}</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2>{-# OPTIONS_GHC -fglasgow-exts 
-fno-monomorphism-restriction #-}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>module Fork where</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial 
size=2>{-----------------------------------------------------------------------------}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>import Prelude hiding (and)</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>import Control.Monad.State</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial 
size=2>{-----------------------------------------------------------------------------}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>data NRef = NS0 
String<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NS1 String 
NRef<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NS2 String NRef 
NRef<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
deriving(Show)</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial 
size=2>{-----------------------------------------------------------------------------}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>data UniqueS = US { nums :: [String] 
}<BR>&nbsp;&nbsp;&nbsp; deriving(Show)</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>type USM a = StateT UniqueS IO a</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>newUniqueS :: UniqueS<BR>newUniqueS = US { nums = [ 
show x | x &lt;- [1..] ] }</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>freshInstance :: String -&gt; USM 
String<BR>freshInstance x = 
do<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(f:fs) &lt;- gets 
nums<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
put $ US { nums = fs 
}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
return $ x ++ f</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial 
size=2>{-----------------------------------------------------------------------------}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>single x = do<BR>&nbsp;&nbsp;&nbsp; x' &lt;- 
freshInstance x<BR>&nbsp;&nbsp;&nbsp; return $ NS0 x'</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>unary x n = do<BR>&nbsp;&nbsp;&nbsp; x' &lt;- 
freshInstance x<BR>&nbsp;&nbsp;&nbsp; n' &lt;- n<BR>&nbsp;&nbsp;&nbsp; return $ 
NS1 x' n'</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>binary x n1 n2 = do<BR>&nbsp;&nbsp;&nbsp; x' &lt;- 
freshInstance x<BR>&nbsp;&nbsp;&nbsp; n1' &lt;- n1<BR>&nbsp;&nbsp;&nbsp; n2' 
&lt;- n2<BR>&nbsp;&nbsp;&nbsp; return $ NS2 x' n1' n2'</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial 
size=2>{-----------------------------------------------------------------------------}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>foxy = single "foxy"<BR>eggs = single 
"eggs"<BR>golden = unary "golden"<BR>white = unary "white"<BR>fries = binary 
"fries"<BR>eats = binary "eats"</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial 
size=2>{-----------------------------------------------------------------------------}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>class Forkable a where<BR>&nbsp;&nbsp;&nbsp; fork 
:: String -&gt; a -&gt; a -&gt; a</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>instance (Forkable a, Forkable b) =&gt; Forkable (a 
-&gt; b) where<BR>&nbsp;&nbsp;&nbsp; fork n a1 a2 a = fork n (a1 a) (a2 
a)</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><BR><FONT face=Arial size=2>{-<BR>instance (Monad m, Forkable (m a), 
Forkable b) =&gt; Forkable (m a -&gt; b) where<BR>&nbsp;&nbsp;&nbsp; fork n a1 
a2 a = 
do<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
a' &lt;- 
a<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
fork n (a1&nbsp;<SPAN class=508301114-14092006>$ return </SPAN>a') 
(a2&nbsp;<SPAN class=508301114-14092006>$ return 
</SPAN>a')<BR>-}<BR>{-----------------------------------------------------------------------------}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>instance Forkable (USM NRef) 
where<BR>&nbsp;&nbsp;&nbsp; fork n a1 a2 = 
do<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
a1' &lt;- 
a1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
a2' &lt;- 
a2<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
return $ NS2 n a1' a2'</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial 
size=2>{-----------------------------------------------------------------------------}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>and = fork "and"</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>test1 = (and foxy eggs)<BR>test2 = (and golden 
white) eggs<BR>test3 = (and fries eats) foxy eggs<BR>test4 = (eats foxy (and 
(golden eggs) (white eggs))) </FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial><FONT size=2>run x = runStateT x newUniqueS &gt;&gt;= 
(putStrLn . show . fst)<BR><SPAN 
class=789152913-14092006>\end{code</SPAN></FONT></FONT></DIV></DIV><BR></DIV></BODY></HTML>
<BR>

<P><FONT SIZE=2>--<BR>
No virus found in this outgoing message.<BR>
Checked by AVG Free Edition.<BR>
Version: 7.1.405 / Virus Database: 268.12.4/448 - Release Date: 14/09/2006<BR>
</FONT> </P>