<font color='black' size='2' face='arial'><font size="2">I'm trying to write a game with a "settings menu" where the user can adjust gameplay options. Right now I pass all the settings around as parameters. I'm trying to figure out how to use the State monad to simplify this task, but I can't figure out how to start. Or maybe my whole design approach is wrongheaded, and not in keeping with best practices. Haskell is my first language. This is the kind of thing I have now:<br>
<br>
mainM color shape =<br>
  putStrLn "\n\nMain Menu" >><br>
  (putStrLn . unlines) [<br>
    "(1) Set",<br>
    "(2) Display",<br>
    "(3) Quit"] >><br>
  putStr "? " >><br>
  getChar >>= \c -><br>
    case c of<br>
      '1' -> set color shape<br>
      '2' -> display color shape<br>
      '3' -> return ()<br>
      _ -> mainM color shape<br>
<br>
set color shape =<br>
  putStrLn "\n\nSettings" >><br>
  (putStrLn . unlines) [<br>
    "(1) Color",<br>
    "(2) Shape",<br>
    "(3) Main Menu"] >><br>
  putStr "? " >><br>
  getChar >>= \c -><br>
    case c of<br>
      '1' -> setColor color shape<br>
      '2' -> setShape color shape<br>
      '3' -> mainM color shape<br>
      _ -> set color shape<br>
 <br>
setColor color shape =<br>
  putStr ("\n\nColor is " ++ color ++ ". New color? ") >><br>
  getLine >>= \cs -><br>
  set cs shape<br>
  <br>
setShape color shape =<br>
  putStr ("\n\nShape is " ++ shape ++ ". New shape? ") >><br>
  getLine >>= \cs -><br>
  set color cs<br>
<br>
display color shape =<br>
  putStrLn ("\n\nColor is " ++ color ++ ". Shape is " ++ shape ++ ".") >><br>
  mainM color shape<br>
<br>
</font></font>