Hey everyone,
I'm making a Game Monad for an assignment (yes, homework) . Here's a little explanation of what I need to do (I can't use anything from Control.Monad.*, I need to do everything myself):
I need to define my newtype Game and make it's Monad instance
I need to make the function :
runGame :: Game a -- A particular game
-> Int -- Initial amount of lives
-> Maybe (a , Int ) -- Result and remaining lives.
I need to make the instance for this class:
class Monad m = > GameMonad m where
extraLife :: m ()
getLives :: m Int
checkPoint :: m a -> m a
die :: m a
now what I've done (I was inspired by the State Monad)
I defined my Game type as follows:
> newtype Game r = Game { execGame :: Int -> Maybe (r,Int) }
My Monad instance like this:
> instance Monad Game where
> return a = Game $ \r -> Just (a,r)
> m >>= k = Game $ \r -> let x = execGame m r
> in case x of
> Just (a, r') -> execGame (k a) r'
> Nothing -> Nothing
and my GameMonad instance:
> instance GameMonad Game where
> extraLife = Game $ \l -> Just ((),l+1)
> getLives = Game $ \l -> Just (l,l)
> die = do
> n <- getLives
> Game $ \_ -> Just ((),n-1) -- Here's the problem
so, what's bothering me? Look at the type signature of die in the GameMonad class, it's supposed to return something of type (m a), but I don't know what to return in that case, and whatever I try to return it doesn't work, because when I try to compile it says that it couldn't match expected type 'a' against infered type 'whatever' ('whatever' being anything, from (), to string, or a number). shouldn't 'a' match with anything I put there?
Note that I can'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't change the signature of the function runGame)