
#10318: Cycles in class declaration (via superclasses) sometimes make sense. -------------------------------------+------------------------------------- Reporter: ekmett | Owner: Type: feature request | Status: new Priority: normal | Milestone: Component: Compiler (Type | Version: 7.10.1 checker) | Keywords: Resolution: | Architecture: Operating System: Unknown/Multiple | Unknown/Multiple Type of failure: GHC rejects | Test Case: valid program | Blocking: Blocked By: | Differential Revisions: Related Tickets: | -------------------------------------+------------------------------------- Comment (by simonpj): Hmm. In all the examples you give, one can statically enumerate the transitive superclasses. Fro example in comment:5 we have {{{ Ring r ==> Module r r ==> Group r ==> Module r Integer ==> Group r -- STOP Ring Integer ==> Module Integer Integer ==> Group Integer ==> Module Integer -- STOP Ring Integer -- STOP Ring r -- STOP }}} Here I am writing {{{ Class a b ==> Superclass1 a b Superclass2 a b }}} with nesting to describe nested superclasses. `STOP` means that we've seen this before, so going on generating superclasses will reveal nothing new. Notice that I reach a fixpoint for every instantiation of `r`. Indeed I can precompute all these transitive superclasses, once and for all, at the class declaration. Similarly for `IntegralDomain`, but I have to use the equalities: class (Frac (Frac a) ~ Frac a, Fractional (Frac a), IntegralDomain (Frac a)) => IntegralDomain a where {{{ ID a ==> Frac (Frac a) ~ Frac a -- (1) Fractional (Frac a) ==> superclasses of Fractional ID (Frac a) ==> Frac (Frac (Frac a)) ~ Frac (Frac a) -- STOP; a consequence of (1) ID (Frac (Frac a) -- rewrite with (1) = ID (Frac a) -- STOP Fractional (Frac (Frac a)) -- rewrite with (1) = Fractional (Frac a) -- STOP }}} In the examples you care about, does the collection of superclasses always statically terminate in this way? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10318#comment:6 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler