Okay, I start to understand better...<br><br>Just, Heinrich, how would implement the mapMonad function in terms of the operational package?<br>You just shown the signature.<br><br><div class="gmail_quote">2010/4/14 Bertram Felgenhauer <span dir="ltr">&lt;<a href="mailto:bertram.felgenhauer@googlemail.com">bertram.felgenhauer@googlemail.com</a>&gt;</span><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="im">Limestraėl wrote:<br>
&gt; Okay, I just understood that &#39;Prompt&#39; was just a sort of view for &#39;Program&#39;.<br>
<br>
</div>Right.<br>
<div class="im"><br>
&gt; &gt;   runMyStackT :: MyStackT (Player m) a -&gt; Player m a<br>
&gt;<br>
&gt; According to what Bertram said, &quot;each strategy can pile its own custom monad<br>
&gt; stack ON the (Player m) monad&quot;.<br>
<br>
</div>Yes, and I meant what Heinrich wrote, you wrap some transformer around<br>
the common Player m monad.<br>
<div class="im"><br>
&gt; &gt; game :: Monad m =&gt; Player m () -&gt; Player m () -&gt; m ()<br>
&gt; As it is written, it requires both players to run in the SAME monad.<br>
&gt; And if have a network player ( e.g.* Player (StateT Handle IO)* ) and an AI<br>
&gt; storing former opponent&#39;s moves ( e.g. *(Monad m) =&gt; Player (StateT [Move]<br>
&gt; m)* ), then they can&#39;t be in the same monad...<br>
<br>
</div>The idea is to pick m = IO, and then use<br>
<br>
  type NetPlayer a = StateT Handle (Player IO) a<br>
<br>
and<br>
<br>
  type AIPlayer a = StateT [Move] (Player IO) a<br>
<br>
or possibly<br>
<br>
  type AIPlayer a = StateT [Move] (Player Identity) a<br>
<br>
using the mapPlayerM (or mapMonad as suggested by Heinrich) function.<br>
<br>
You&#39;d then provide functions like<br>
<br>
    runAIPlayer :: AIPlayer a -&gt; Player IO a<br>
    runAIPlayer player = {- mapMonad (return . runIdentity) $ -}<br>
        evalStateT player []<br>
<br>
This gives you most of what you want: You can add custom state and the<br>
like to each player. You can not hope to exchange the base monad m,<br>
because then the &#39;game&#39; function would have to know how to run both<br>
of those base monads simultaneously. A function like mapMonad is the<br>
best device you can hope for, I think.<br>
<br>
regards,<br>
<font color="#888888"><br>
Bertram<br>
</font><div><div></div><div class="h5">_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</div></div></blockquote></div><br>