
Maurício wrote:
Notice that rotX, rotY and pos are meant to be used as comunication between the keyboardMouse and display functions. They need to be set as 0 first, so display won't do anything. Only when they user press a few buttons that those values change, so display behaves accordanly.
In a state-based language I would place display and keyboardMouse in one module and let them communcate to each other like they want. In haskell, I'm not quite sure how to do it except by that parameter passing style.
In one module, you can write:
---------- giveMeFunctions = do { newIORef ... newIORef ... newIORef ... (...) let f1 = ... let f2 = ... return (f1,f2) ----------
and in the main:
(keyboardMouse,display) <- giveMeFunctions
Doing it like that I could have all the definitions in one module, but it doesn't solve another important problem: keyboardMouse and display functions have to have as many parameters as there are IORefs. In my particular case, since I find out what key the use has pressed through pattern matching, keyboardMouse has several definitions. So adding a new IORef means adding a wildcard parameter to each keyboardMouse definition. As well as a new parameter to the display function. Which looks a bit clumbersome to me. In a state-based language I'd have something in the lines of: switch (key) { case LEFT_KEY : /* using var1 ... */ case RIGHT_KEY : /* using var2 ... */ } then, handling a new case would be a matter of adding a global variable and adding a new case in the end of the function containing the switch. Whereas in Haskell I would have something like keyboard var1 _ LeftKey = ... keyboard _ var2 RightKey = ... If I wanted to add a new IORef I'd have to do something like: keyboard var1 _ _ LeftKey = ... keyboard _ var2 _ RightKey = ... keyboard _ _ var3 RightKey = ... So, I had to change all previous definitions.