Skip to content

Flag to not expand type families

Error messages can be ugly, especially when working with promoted types. I've been dealing with this for a long time with [one library in particular](https://hackage.haskell.org/package/lol). But I just encountered something truly heinous. Due to a minor mistake, GHC spit out 8 errors in total, the shortest of which was 60 lines, and the longest of which was 20,046 lines long. That's no typo: the last error is over 20,000 lines long. Props to GHC for handling such a mess. As the library author, I've learned to look paste these massive errors. But I'm afraid that some user is going to have a heart attack (or worse: give up and go home).

You can see in the error message that most of it is recurring blocks of

PrimePower
('PP
  '(type-natural-0.3.0.0:Data.Type.Natural.Definitions.SSym1
      (type-natural-0.3.0.0:Data.Type.Natural.Definitions.SSym1
         (type-natural-0.3.0.0:Data.Type.Natural.Definitions.SSym1
            (type-natural-0.3.0.0:Data.Type.Natural.Definitions.SSym1
               (type-natural-0.3.0.0:Data.Type.Natural.Definitions.SSym1
                  (type-natural-0.3.0.0:Data.Type.Natural.Definitions.SSym1
                     (type-natural-0.3.0.0:Data.Type.Natural.Definitions.SSym1
                        type-natural-0.3.0.0:Data.Type.Natural.Definitions.ZSym0)))))),
    type-natural-0.3.0.0:Data.Type.Natural.Definitions.SSym1
      type-natural-0.3.0.0:Data.Type.Natural.Definitions.ZSym0))

and

(NextListElt
  *
  zq
  ((':)
     *
     (ZqBasic * Types.Q18869761 Types.Z)
     ((':)
        *
        (Types.Zq * Types.Q19393921, ZQ1)
        ((':)
           *
           (Types.Zq * Types.Q19918081, ZQ2)
           ((':)
              *
              (Types.Zq * Types.Q2149056001, ZQ3)
              ((':)
                 *
                 (Types.Zq * Types.Q3144961, ZQ4)
                 ((':)
                    * (Types.Zq * Types.Q7338241, ZQ5) ('[] *))))))))),

I believe that GHC attempts to expand type synonyms as much as possible, which is great in many cases. But for this error, the repetition of fully expanded blocks completely hides the true nature of the error, especially since the user (obviously) makes heavy use of type synonyms anyway.

The feature I'm requesting is the ability to somehow reduce the mess in the attached error. Here are a few ideas:

  1. A flag to tell GHC to *not* expand type synonyms, i.e. if the user uses N2 from Data.Type.Natural, GHC should print 'N2' instead of
type-natural-0.3.0.0:Data.Type.Natural.Definitions.SSym1
 (type-natural-0.3.0.0:Data.Type.Natural.Definitions.SSym1
   type-natural-0.3.0.0:Data.Type.Natural.Definitions.ZSym0)
  1. Allow library developers a way to tell the compiler how to print a certain entity, i.e., with a custom name. This is somewhat similar to the Custom Type Errors proposal, but I don't think that proposal includes a way to tell GHC how to print specific types/type synonyms.

Has anyone else run into this issue before? Are there any existing solutions or other ideas?

Trac metadata
Trac field Value
Version 7.10.2
Type FeatureRequest
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
Edited by Eric Crockett
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information