[email protected] schrieb:
> That sort of code (stripped out):
> 
> In Game.hs:
> 
> data Game = Game { ...
>                    activeRules :: [Rule]}
> 
> applyTo :: Rule -> Game -> Game
> applyTo r gs = ...
> 
> 
> In Rule.hs:
> 
> data Rule = Cond (Obs) Rule Rule
>           | many others..
>           deriving (Read, Show, Eq, Typeable)
> 
> data NamedRule = NamedRule { ...,
>                              rule :: Rule }
> 
> isRuleLegal :: Rule -> NamedRule -> Game -> Bool
> isRuleLegal = ...
> 
> 
> In Obs.hs:
> 
> data Obs a where
>      ProposedBy :: Obs Int   -- The player that proposed the tested rule
>      ...
> 
> 
> evalObs :: Obs -> NamedRule -> Game -> EvalObsType
> evalObs = ...

As I see there is no cycle in the types. How about defining Game, Rule,
Obs in private modules, like Private.Game, Private.Rule, Private.Obs,
and implementing the functions in public modules like Game, Rule, Obs ?

_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to