[Haskell-cafe] Re: Sometimes I wish there was a global variable
Rafael Cunha de Almeida
almeidaraf at gmail.com
Sun Mar 22 19:10:28 EDT 2009
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.
More information about the Haskell-Cafe
mailing list