[GHC] #14341: Show instance for TypeReps is a bit broken

#14341: Show instance for TypeReps is a bit broken -------------------------------------+------------------------------------- Reporter: dfeuer | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Core | Version: 8.2.1 Libraries | Keywords: Typeable | Operating System: Unknown/Multiple Architecture: | Type of failure: None/Unknown Unknown/Multiple | Test Case: | Blocked By: Blocking: | Related Tickets: Differential Rev(s): Phab:D4084 | Wiki Page: -------------------------------------+------------------------------------- There are two problems. 1. Showing typereps of tuples can produce unnecessary parentheses: {{{ Prelude K T> typeRep @(Int, Maybe Bool) (Int,(Maybe Bool)) }}} The fix is trivial. 2. Showing typereps of ticked (i.e., lifted) tuples and lists gives hard- to-read results, because it does not use the usual special syntax: {{{ Prelude K T> typeRep @'(Int, Maybe Bool) '(,) * * Int (Maybe Bool) Prelude K T> typeRep @'[1,2,3] ': Nat 1 (': Nat 2 (': Nat 3 ('[] Nat))) }}} Fixing the lifted tuple case is trivial. Fixing the lifted list case is slightly less trivial, but not hard. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14341 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#14341: Show instance for TypeReps is a bit broken -------------------------------------+------------------------------------- Reporter: dfeuer | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Core Libraries | Version: 8.2.1 Resolution: | Keywords: Typeable Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Phab:D4084 Wiki Page: | -------------------------------------+------------------------------------- Comment (by dfeuer): Actually, there's a third problem as well: type operators are not shown infix! The solution, I believe, is to add operator precedence to `TyCon`, and then to use something akin to `Show` derivation machinery in `showTypeRep`. I imagine we don't need to worry too much about showing these things ''efficiently'', at least for the foreseeable future. `SomeTypeRep` has no `Read` instance, so there's no substantial risk of anyone trying to use its `Show` instance for anything other than error messages and interactive exploration. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14341#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#14341: Show instance for TypeReps is a bit broken -------------------------------------+------------------------------------- Reporter: dfeuer | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Core Libraries | Version: 8.2.1 Resolution: | Keywords: Typeable Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Phab:D4084 Wiki Page: | -------------------------------------+------------------------------------- Description changed by dfeuer: Old description:
There are two problems.
1. Showing typereps of tuples can produce unnecessary parentheses:
{{{ Prelude K T> typeRep @(Int, Maybe Bool) (Int,(Maybe Bool)) }}}
The fix is trivial.
2. Showing typereps of ticked (i.e., lifted) tuples and lists gives hard- to-read results, because it does not use the usual special syntax:
{{{ Prelude K T> typeRep @'(Int, Maybe Bool) '(,) * * Int (Maybe Bool)
Prelude K T> typeRep @'[1,2,3] ': Nat 1 (': Nat 2 (': Nat 3 ('[] Nat))) }}}
Fixing the lifted tuple case is trivial. Fixing the lifted list case is slightly less trivial, but not hard.
New description: There are three problems. 1. Showing typereps of tuples can produce unnecessary parentheses: {{{ Prelude K T> typeRep @(Int, Maybe Bool) (Int,(Maybe Bool)) }}} The fix is trivial. 2. Showing typereps of ticked (i.e., lifted) tuples and lists gives hard- to-read results, because it does not use the usual special syntax: {{{ Prelude K T> typeRep @'(Int, Maybe Bool) '(,) * * Int (Maybe Bool) Prelude K T> typeRep @'[1,2,3] ': Nat 1 (': Nat 2 (': Nat 3 ('[] Nat))) }}} Fixing the lifted tuple case is trivial. Fixing the lifted list case is slightly less trivial, but not hard. 3. Type operator applications are not shown infix. {{{ Prelude K T> typeRep @(Maybe :*: Either Int) :*: * Maybe (Either Int) }}} This is the hardest problem to fix, although it's probably not too terribly hard. See comment:1 for thoughts. -- -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14341#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#14341: Show instance for TypeReps is a bit broken -------------------------------------+------------------------------------- Reporter: dfeuer | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Core Libraries | Version: 8.2.1 Resolution: | Keywords: Typeable Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Phab:D4084 Wiki Page: | -------------------------------------+------------------------------------- Comment (by PhilippD): There's also a problem with displaying partially applied tuple type constructors: {{{ λ> typeRep @((,,)) () λ> typeRep @((,,,,,,,) Int Word) (Int,Word) }}} The problem seems to be that `showTypeable` doesn't check the arity of the constructor and just applies `showArgs` to the type arguments. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14341#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#14341: Show instance for TypeReps is a bit broken -------------------------------------+------------------------------------- Reporter: dfeuer | Owner: (none) Type: bug | Status: patch Priority: normal | Milestone: 8.6.1 Component: Core Libraries | Version: 8.2.1 Resolution: | Keywords: Typeable Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Phab:D4084, Wiki Page: | Phab:D5080 -------------------------------------+------------------------------------- Changes (by bgamari): * status: new => patch * differential: Phab:D4084 => Phab:D4084, Phab:D5080 * milestone: => 8.6.1 Comment: I whipped up Phab:D5080 which solves the correctness problem mentioned in comment:3 simply. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14341#comment:4 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler

#14341: Show instance for TypeReps is a bit broken
-------------------------------------+-------------------------------------
Reporter: dfeuer | Owner: (none)
Type: bug | Status: patch
Priority: normal | Milestone: 8.6.1
Component: Core Libraries | Version: 8.2.1
Resolution: | Keywords: Typeable
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s): Phab:D4084,
Wiki Page: | Phab:D5080
-------------------------------------+-------------------------------------
Comment (by Ben Gamari

#14341: Show instance for TypeReps is a bit broken -------------------------------------+------------------------------------- Reporter: dfeuer | Owner: (none) Type: bug | Status: patch Priority: normal | Milestone: 8.6.1 Component: Core Libraries | Version: 8.2.1 Resolution: | Keywords: Typeable Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Phab:D4084, Wiki Page: | Phab:D5080 -------------------------------------+------------------------------------- Comment (by bgamari): There is still more than could be done here but at least the correctness issues are solved. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14341#comment:6 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler
participants (1)
-
GHC