
On 2/5/07, Matthew Brecknell
I'm not familiar with wxHaskell, but I don't think wxHaskell is your problem here. It looks like you are confusing yourself with overuse of "do" notation, and perhaps a lack of understanding of the monad laws. Whenever you see this:
v <- expr return v
You can replace it with just "expr". Your code above reduces to:
words <- varCreate (readWords "words")
Okay - was confused about that. Thanks for the tip.
So the variable you are creating has type (IO WordMap), when you probably wanted it to have type WordMap. By itself, this compiles, because IO actions are values as good as any other. The problem only manifests when you combine it with code that tries to read the variable as if it had type WordMap.
This is probably what you wanted (untested):
w <- readWords "words" words <- varCreate w
That didn't work, because (as someone on #haskell explained to me) readWords has type IO and the wx actions have type Layout
The wxHaskell Var type is not quite like the State monad. It is a type of mutable variable in the IO monad, much like the IORef type. Try to avoid gratuitous use of mutable variables, as they can weaken your ability to reason about your code. I'm not convinced you really need one here. What problem are you trying to solve by using a mutable variable?
You're right, I don't need mutable variables, just some sort of state. I'm writing a game which presents the user with a list of anagrams (read in from a file) and an input box in which to enter guesses. The input box's on command is (pseudocode) a <- get input text if exists a wordmap remove a wordmap update display else say "wrong" So what I need is for the gui code to have a single wordmap threaded through it. I thought I could do that by reading in the wordmap within the gui do sequence and binding it to a variable. martin