[Haskell-cafe] Advice for clean code.

Stefan O'Rear stefanor at cox.net
Mon Dec 3 22:17:28 EST 2007

On Mon, Dec 03, 2007 at 08:47:48PM -0600, David McBride wrote:
> I am still in the early stages learning haskell, which is my first foray 
> into functional programming.  Well there's no better way to learn than to 
> write something, so I started writing a game.
> Mostly the thing looks good so far, far better than the C version did.  
> However, my problem is that code like the following is showing up more 
> often and it is becoming unwieldy.
> gameLoop :: World -> IO ()
> gameLoop w = do
>   drawScreen w
>   action <- processInput
>   let (result, w') = processAction action w
>   case result of
>     MoveOutOfBounds -> putStrLn "Sorry you can't move in that direction."
>     MoveBadTerrain a -> case a of
>       Wall -> putStrLn "You walk into a wall."
>       Tree -> putStrLn "There is a tree in the way."
>       otherwise -> putStrLn "You can't move there."
>     otherwise -> return ()
>   let w'' = w' { window = updateWindowLocation (window w') (location $ 
> player w')}
>   unless (action == Quit) (gameLoop w'')
> Where world contains the entire game's state and so I end up with w's with 
> multiple apostrophes at the end.  But at the same time I can't really break 
> these functions apart easily.  This is error prone and seems pointless.
> I have been reading about control.monad.state and I have seen that I could 
> run execstate over this and use modify but only if each function took a 
> world and returned a world.  That seems really limiting.  I'm not even sure 
> if this is what I should be looking at.
> I am probably just stuck in an imperative mindset, but I have no idea what 
> to try to get rid of the mess and it is only going to get worse over time.  
> Any suggestions on what I can do about it?

I'd recommend using StateT World IO.  You can always run other functions
using 'lift'; for instance lift can be :: IO () -> StateT World IO ().

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://www.haskell.org/pipermail/haskell-cafe/attachments/20071203/c3be6ffd/attachment.bin

More information about the Haskell-Cafe mailing list