<div class="gmail_quote"><div><div>Hey everyone,</div><div><br></div><div>I&#39;m making a Game Monad for an assignment (yes, homework) . Here&#39;s a little explanation of what I need to do (I can&#39;t use anything from Control.Monad.*, I need to do everything myself):</div>

<div><br></div><div>I need to define my newtype Game and make it&#39;s Monad instance</div><div><br></div><div>I need to make the function :</div><div>runGame :: Game a            -- A particular game</div><div>              -&gt; Int                   -- Initial amount of lives</div>

<div>              -&gt; Maybe (a , Int ) -- Result and remaining lives.</div><div><br></div><div>I need to make the instance for this class:</div><div><div>class Monad m = &gt; GameMonad m where</div><div>  extraLife :: m ()</div>

<div>  getLives   :: m Int</div><div>  checkPoint :: m a -&gt; m a</div><div>  die        :: m a</div></div><div><br></div><div>now what I&#39;ve done (I was inspired by the State Monad) </div><div><br></div>
<div>I defined my Game type as follows:</div><div>&gt; newtype Game r = Game { execGame :: Int -&gt; Maybe (r,Int) }</div><div><br></div><div>My Monad instance like this:</div><div><div>&gt; instance Monad Game where</div>

<div>&gt;     return a = Game $ \r -&gt; Just (a,r)</div><div>&gt;     m &gt;&gt;= k  = Game $ \r -&gt; let x = execGame m r</div><div>&gt;         in case x of</div><div>&gt;           Just (a, r&#39;) -&gt; execGame (k a) r&#39;</div>

<div>&gt;           Nothing      -&gt; Nothing</div></div><div><br></div><div>and my GameMonad instance:</div><div><div>&gt; instance GameMonad Game where</div><div>&gt;   extraLife    = Game $ \l -&gt; Just ((),l+1)</div>

<div>&gt;   getLives     = Game $ \l -&gt; Just (l,l)</div><div>&gt;   die          = do</div><div>&gt;     n &lt;- getLives</div><div>&gt;     Game $ \_ -&gt; Just ((),n-1) -- Here&#39;s the problem</div></div></div><div>

<br></div><div>so, what&#39;s bothering me? Look at the type signature of die in the GameMonad class, it&#39;s supposed to return something of type (m a), but I don&#39;t know what to return in that case, and whatever I try to return it doesn&#39;t work, because when I try to compile it says that it couldn&#39;t match expected type &#39;a&#39; against infered type &#39;whatever&#39; (&#39;whatever&#39; being anything, from (), to string, or a number). shouldn&#39;t &#39;a&#39; match with anything I put there?</div>

<div><br></div><div>Note that I can&#39;t change the signatures because they were giving to me that way and I already checked with teacher if they were right. (I fixed it returning Maybe (Maybe a, Int) instead, but I can&#39;t change the signature of the function runGame)</div>

<div><br></div><div>Thanks you,</div><div><br></div><div>Hector Guilarte </div></div>