Hi everybody,
I'm still working on implementing a nomic game in Haskell.
Although the game is pretty advanced, I'm still confused by one fundamental question:
A nomic game is composed of rules.
A Rule is a sort of little program submitted by the player during the game. They come in two fashions:
- a Normal rule, when executed, can change the state of the Game.
- a Meta rule, when executed on another rule, can assess the legality of that rule and change the state of the Game.
In those definitions, the Game can be seen as a data structure containing all the current state of the game. Sorry if it's a bit abstract, but as it's fairly complex,
I'd prefer to keep it like this for the moment.
Thus, I found that those definitions can be translated to two possible type definitions:
type NormalRule = State Game ()
type MetaRule = Rule -> State Game Bool
data Rule = MR MetaRule | NR NormalRule
*** or ***
newtype Rule = Rule {rule :: Maybe Rule -> (State Game Bool)}
All rules submitted by the user must be of the type Rule. It is thus important that it is very clean.
Which type do you prefer?
I find both heavy and redundant. The first forces me to specify if I want an argument of not (with the constructors MR and NR), the second forces me to pass the Nothing argument in the case of a Normal rule, and to return a dummy value (for ex. return True).
Do you know of a construction/abstraction that allows having or not an argument (a variable number of arguments, here zero or one)?
Thanks!
Corentin