
#16119: Hide the gnarly levity polymorphism stuff in the signatures of `undefined`, `throw`, etc -------------------------------------+------------------------------------- Reporter: jberryman | Owner: (none) Type: feature | Status: new request | Priority: normal | Milestone: Component: | Version: 8.6.3 libraries/base | Keywords: | Operating System: Unknown/Multiple Architecture: | Type of failure: None/Unknown Unknown/Multiple | Test Case: | Blocked By: Blocking: | Related Tickets: Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- In base-4.12, `throw` goes from {{{#!hs throw :: Exception e => e -> a }}} to {{{#!hs throw :: forall (r :: RuntimeRep). forall (a :: TYPE r). forall e. Exception e => e -> a }}} http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Exception- Base.html#v:throw Similar story for `undefined`. Even as a fairly experienced haskell programmer I find the signature difficult to parse, leaving aside the meaning of `RuntimeRep` and `TYPE`. The amount of research an expert in Haskell 98 would have to do to thoroughly understand that signature is unreasonable (the various meanings of `forall`, `DataKinds`, as well as the levity polymorphism stuff). I don't have a proposed solution, but a constraint synonym or something that hid `RuntimeRep` and `TYPE`, and which could be documented with "This means a type with any runtime representation; everything is fine" would be okay. Relevant: https://ghc.haskell.org/trac/ghc/ticket/12030 https://ghc.haskell.org/trac/ghc/ticket/11549 -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/16119 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler