
On Thu, Aug 14, 2008 at 03:33:26PM +0100, Alex Watt wrote:
If I call "main" in ghci, my program runs as it should, but if I try compiling it, and then running the result of that compilation, i.e.:
$ ghc -o animal_game game.hs $ ./animal_game
unexpected things occur, particularly "getChar" does not work correctly, and
When you say 'getchar does not work correctly', exactly what do you mean? I'm not sure of the problem, but this smells to me of something having to do with buffering and/or newline characters not getting handled properly.
What would also be nice is any comments on the actual code; as a begginner, it's nice to get some feedback, and I might as well also ask the following question. Originally I wanted to the types to be as such:
data Animal = Animal String data Question a b = Question String a b -- where a is a Question or an Animal, as is b
The problem is I wanted methods that had types that were able to accept an argument of type Animal or Question, and for it to act appropriately on that type, I tried adding them to common type classes (a new one I created called 'Askable' which contained a method 'ask'), but I ran into a whole bunch of problems. Is there any easy way to do it?
Creating an 'Askable' type class sounds like it would be a great solution in certain instances; the problem to me looks like the fact that you want to create a data structure (a QuestionTree) which contains both Animals and Questions. This quickly leads into existential types---doable, but probably best left until later. At any rate, your current solution---making Animal and Question constructors of a data type, and implementing play' and other such functions by pattern matching---seems quite nice. It's certainly the approach I would take. In general your code looks very nice. The only comment I have is that I would separate out play' and getNewAnimal as separate top-level functions, rather than defining them in a 'where' block. Functions which are not top-level are difficult to test by themselves. -Brent