
That sort of code (stripped out):
In Game.hs:
data Game = Game { ... activeRules :: [Rule]}
applyTo :: Rule -> Game -> Game applyTo r gs = ...
Often, it helps to parameterize the types/functions (instead of using recursive modules to hardcode the parameters). Would something like this work for your case (taking the Game module out of the loop)? data Game rule = Game { ... activeRules :: [rule]} applyTo :: rule -> Game rule -> Game rule applyTo r gs = ...
In Rule.hs: .. isRuleLegal :: Rule -> NamedRule -> Game Rule -> Bool isRuleLegal = ...
In Obs.hs:
evalObs :: Obs -> NamedRule -> Game Rule -> EvalObsType evalObs = ...
For the record, I'd like to have recursive modules without having to go outside the language (some standardized notion of Haskell module interfaces would be nicer than implementation-specific boot files). But I'd like to have parameterized modules even more, as that would allow me to avoid many use cases of recursive modules (again, that would seem to require module interfaces). Claus