Re: [GHC] #12102: “Constraints in kinds” illegal family application in instance (+ documentation issues?)
GHC
ghc-devs at haskell.org
Wed May 3 22:53:18 UTC 2017
#12102: “Constraints in kinds” illegal family application in instance (+
documentation issues?)
-------------------------------------+-------------------------------------
Reporter: Iceland_jack | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.0.1
Resolution: | Keywords: TypeInType
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Description changed by Iceland_jack:
@@ -16,1 +16,2 @@
- Deriving a standalone `Show` instance *without* the constraint works fine
+ Deriving a standalone `Show` instance *without* the constraint `(IsTypeLit
+ a ~ 'True) => ` works fine
New description:
GHC 8.0.0.20160511. Example from the user guide:
[https://downloads.haskell.org/~ghc/8.0.1/docs/html/users_guide/glasgow_exts.html
#constraints-in-kinds Constraints in kinds]
{{{#!hs
type family IsTypeLit a where
IsTypeLit Nat = 'True
IsTypeLit Symbol = 'True
IsTypeLit a = 'False
data T :: forall a. (IsTypeLit a ~ 'True) => a -> * where
MkNat :: T 42
MkSymbol :: T "Don't panic!"
}}}
Deriving a standalone `Show` instance *without* the constraint `(IsTypeLit
a ~ 'True) => ` works fine
{{{#!hs
deriving instance Show (T a)
}}}
but I couldn't define a `Show` instance given the constraints:
{{{#!hs
-- • Couldn't match expected kind ‘'True’
-- with actual kind ‘IsTypeLit a0’
-- The type variable ‘a0’ is ambiguous
-- • In the first argument of ‘Show’, namely ‘T a’
-- In the stand-alone deriving instance for ‘Show (T a)’
deriving instance Show (T a)
}}}
let's add constraints
{{{#!hs
-- • Couldn't match expected kind ‘'True’
-- with actual kind ‘IsTypeLit lit’
-- • In the first argument of ‘Show’, namely ‘T (a :: lit)’
-- In the instance declaration for ‘Show (T (a :: lit))’
instance IsTypeLit lit ~ 'True => Show (T (a :: lit)) where
}}}
let's derive for a single literal
{{{#!hs
-- • Illegal type synonym family application in instance:
-- T Nat
-- ('Data.Type.Equality.C:~
-- Bool
-- (IsTypeLit Nat)
-- 'True
-- ('GHC.Types.Eq# Bool Bool (IsTypeLit Nat) 'True <>))
-- 42
-- • In the stand-alone deriving instance for ‘Show (T (42 :: Nat))’
deriving instance Show (T (42 :: Nat))
}}}
same happens with
{{{#!hs
instance Show (T 42) where
}}}
----
The documentation
> Note that explicitly quantifying with `forall a` is not necessary here.
seems to be wrong since removing it results in
{{{
tVDv.hs:10:17-18: error: …
• Expected kind ‘a’, but ‘42’ has kind ‘Nat’
• In the first argument of ‘T’, namely ‘42’
In the type ‘T 42’
In the definition of data constructor ‘MkNat’
Compilation failed.
}}}
--
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/12102#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list