Hi Jedi (why not?)<br><br>Thanks for the tips...<br><br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div>
&gt; say i = putStrLn $ show i<br>
<br>
</div>This already exist and is called &quot;print&quot; (though its type is more<br>
general than your signature).<br>
<br></blockquote><div> </div><div> So it is. <br></div><div>  <br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div>
&gt; walk i = randomRIO (0,1) &gt;&gt;= \r -&gt; return (i+r*2-1)<br>
<br>
</div>The &gt;&gt;= ... return is pretty ugly, it would rather be written as :<br>
<br>
&gt; walk i = fmap (\r -&gt; i + r * 2 - 1) $ randomRIO (0,1)<br>
<div><br></div></blockquote><div><br>Well, for the time being I like to see exactly what&#39;s happening with the monads. That&#39;s why I don&#39;t use do. There&#39;ll come a day when I already know and I&#39;ll bear it in mind for then.<br>

 </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div>
&gt; rep n i w s<br>
<br>
</div>Passing say and walk as parameter seems a bit overkill, I seriously<br>
doubt that you&#39;ll ever need this exact structure again, and even then<br>
passing a single action should be enough :<br>
<br>
&gt; rep n act i<br>
&gt;   | n &lt;= 0 = return ()<br>
&gt;   | otherwise = act i &gt;&gt;= \x -&gt; rep (n-1) act x<br>
<br></blockquote><div><br>But what do I pass for act? walk.say? say&gt;&gt;walk? <br> <br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">


rep may also be written with standard monad operations :<br>
&gt; rep n act i = foldM (\x _  -&gt; act x) i $ replicate (n-1) ()<br>
<br></blockquote><div><br>Cunning. But it seems a bit round-the-houses to me. I mean, there&#39;s no fundamental reason for that list of nothings; it&#39;s just plugging a hole in haskell. My counter looks naive but at least it&#39;s to the point. I guess it&#39;s a matter of taste.<br>

<br> <br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Lastly it may be that the structure of the program itself,<br>
particularly the use of randomRIO is suboptimal and a bit ugly, for a<br>
throwaway program I would probably just use randomRs :<br>
<br>
&gt; main = do<br>
&gt;   g &lt;- newStdGen<br>
&gt;   mapM_ print . tail . scanl (\i r -&gt; i+r*2-1) 50 . take 10 $ randomRs (0,1) g<br>
<br></blockquote><div> </div><div>Are there some extra dots in there? <br><br>Actually, I can&#39;t let the number of random numbers control the number of iterations because my algorithm asks for random numbers when it feels like it. You can&#39;t predict how many unless you can predict the random numbers. My main loop is like this:<br>
<br>step (w,i,o) = env o             &gt;&gt;= \i&#39; -&gt;<br>               think w i&#39;        &gt;&gt;= \o&#39; -&gt;<br>               learn w i i&#39; o o&#39; &gt;&gt;= \w&#39; -&gt;<br>               return (w&#39;, i&#39;, o&#39;)<br>
<br>I tried to tidy that up by factoring out that &quot;remember the last iteration&quot; business. (It&#39;s a Hebbian learning rule.) I figured I could use a comonad containing the current and previous values of i and o, a function that takes both and returns the new value, and let cobind shuffle them along. It didn&#39;t work though because I wasn&#39;t allowed to say:<br>
<br>instance Comonad (a,a) where ...<br><br>Apparently <br><br>instance Comonad ((,) a) where ...<br><br>is legal, but I really want to say that both elements of the tuple are the same, otherwise everything else barfs. Is there some workaround for that? The compiler seemed to imply that you can only ever have one parameter to a type in an instance declaration, but that would see rather limiting and arbitrary. What&#39;s the deal here?<br>
<br>Adrian.<br> <br> </div><br>
</div>