
#14869: Documentation for isLiftedTypeKind is incorrect -------------------------------------+------------------------------------- Reporter: RyanGlScott | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler (Type | Version: 8.2.2 checker) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Documentation | Unknown/Multiple bug | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Description changed by RyanGlScott: Old description:
I [https://github.com/ghc-proposals/ghc- proposals/pull/32#issuecomment-369252383 noticed recently] that Template Haskell reifies `Constraint` as `Type`:
{{{#!hs $ ~/Software/ghc2/inplace/bin/ghc-stage2 --interactive GHCi, version 8.5.20180221: http://www.haskell.org/ghc/ :? for help Loaded GHCi configuration from /home/rgscott/.ghci λ> :set -XTypeFamilies -XTemplateHaskell λ> :m + Data.Kind Language.Haskell.TH λ> type family Foo :: Constraint λ> putStrLn $(reify ''Foo >>= stringE . pprint) type family Ghci1.Foo :: * }}}
The root of the issue can be traced back to the `isLiftedTypeKind` function, which `TcSplice` uses to distinguish `Type` from `Constraint`. At least, that's what its [http://git.haskell.org/ghc.git/blob/df2c3b3364834d2fd038192c89348fc50a2e0475... documentation] claims:
{{{ -- | This version considers Constraint to be distinct from *. Returns True -- if the argument is equivalent to Type and False otherwise. isLiftedTypeKind :: Kind -> Bool isLiftedTypeKind = is_TYPE is_lifted where is_lifted (TyConApp lifted_rep []) = lifted_rep `hasKey` liftedRepDataConKey is_lifted _ = False }}}
However, in practice this claim about treating `Constraint` and `Type` as distinct is false:
{{{ $ ~/Software/ghc2/inplace/bin/ghc-stage2 --interactive -package ghc GHCi, version 8.5.20180221: http://www.haskell.org/ghc/ :? for help Loaded GHCi configuration from /home/rgscott/.ghci λ> :m + TyCoRep TysWiredIn λ> isLiftedTypeKind liftedTypeKind True λ> isLiftedTypeKind constraintKind True }}}
Either we should change the implementation of `isLiftedTypeKind` to match the documentation's claim, or change the documentation.
New description: I [https://github.com/ghc-proposals/ghc- proposals/pull/32#issuecomment-369252383 noticed recently] that Template Haskell reifies `Constraint` as `Type`: {{{ $ ~/Software/ghc2/inplace/bin/ghc-stage2 --interactive GHCi, version 8.5.20180221: http://www.haskell.org/ghc/ :? for help Loaded GHCi configuration from /home/rgscott/.ghci λ> :set -XTypeFamilies -XTemplateHaskell λ> :m + Data.Kind Language.Haskell.TH λ> type family Foo :: Constraint λ> putStrLn $(reify ''Foo >>= stringE . pprint) type family Ghci1.Foo :: * }}} The root of the issue can be traced back to the `isLiftedTypeKind` function, which `TcSplice` uses to distinguish `Type` from `Constraint`. At least, that's what its [http://git.haskell.org/ghc.git/blob/df2c3b3364834d2fd038192c89348fc50a2e0475... documentation] claims: {{{ -- | This version considers Constraint to be distinct from *. Returns True -- if the argument is equivalent to Type and False otherwise. isLiftedTypeKind :: Kind -> Bool isLiftedTypeKind = is_TYPE is_lifted where is_lifted (TyConApp lifted_rep []) = lifted_rep `hasKey` liftedRepDataConKey is_lifted _ = False }}} However, in practice this claim about treating `Constraint` and `Type` as distinct is false: {{{ $ ~/Software/ghc2/inplace/bin/ghc-stage2 --interactive -package ghc GHCi, version 8.5.20180221: http://www.haskell.org/ghc/ :? for help Loaded GHCi configuration from /home/rgscott/.ghci λ> :m + TyCoRep TysWiredIn λ> isLiftedTypeKind liftedTypeKind True λ> isLiftedTypeKind constraintKind True }}} Either we should change the implementation of `isLiftedTypeKind` to match the documentation's claim, or change the documentation. -- -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14869#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler