Ticket #323 (closed bug: fixed)
Exponential behaviour with type synonyms
| Reported by: | simonpj | Owned by: | simonpj |
|---|---|---|---|
| Priority: | low | Milestone: | _|_ |
| Component: | Compiler (Type checker) | Version: | 6.4.1 |
| Keywords: | Cc: | ||
| Operating System: | Unknown/Multiple | Architecture: | Unknown/Multiple |
| Type of failure: | Difficulty: | Unknown | |
| Test Case: | syn-perf2 | Blocked By: | |
| Blocking: | Related Tickets: |
Description (last modified by simonmar) (diff)
You're quite right. GHC has a simple but non- performant representation of type synonyms in types, so as to be able to generate good error messages, In particular, the type S t where S is a type synonym defined by 'type S a = s', is represented as SynNote (S t) (s [t/a]) That is, (S t) is represented by *both* its un-expanded and expanded form. The SynNote is ignored by unification, but the un- expanded form is useful for error messages. Unfortunately, t is duplicated, as you can see, and that leads to the behaviour you describe. I don't see myself fixing this soon, at least partly because I can't see an obvious way to fix it that doesn't lose error message behaviour. I'm going to open a SourceForge bug for it. If anyone has good ideas, let me know. Simon | -----Original Message----- | From: glasgow-haskell-bugs-bounces@haskell.org [mailto:glasgow-haskell-bugs- | bounces@haskell.org] On Behalf Of Iavor Diatchki | Sent: 17 February 2005 01:27 | To: glasgow-haskell-bugs@haskell.org | Subject: 'type' declarations | | hello, | ghc seems to be having trouble with 'type' declarations. | while compiling (i guess kind checking is the correct word here) | the following program for a very long time, ghc (6.2) runs out of 300Mb of heap. | | module Test where | | type S = Maybe | type S2 n = S (S n) | type S4 n = S2 (S2 n) | type S8 n = S4 (S4 n) | type S16 n = S8 (S8 n) | type S32 n = S16 (S16 n) | | type N64 n = S32 (S32 n) | | type N64' = | S ( S ( S ( S ( S ( S ( S ( S ( | S ( S ( S ( S ( S ( S ( S ( S ( | S ( S ( S ( S ( S ( S ( S ( S ( | S ( S ( S ( S ( S ( S ( S ( S ( | S ( S ( S ( S ( S ( S ( S ( S ( | S ( S ( S ( S ( S ( S ( S ( S ( | S ( S ( S ( S ( S ( S ( S ( S ( | S ( S ( S ( S ( S ( S ( S ( S ( | Int | )))))))) | )))))))) | )))))))) | )))))))) | )))))))) | )))))))) | )))))))) | )))))))) | | if i remove the N64 definition things work. i guess something | exponential is happening | (substitution?). | | -iavor
Change History
Note: See
TracTickets for help on using
tickets.
