
#11719: Cannot use higher-rank kinds with type families -------------------------------------+------------------------------------- Reporter: ocharles | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: 8.8.1 Component: Compiler (Type | Version: 8.0.1-rc2 checker) | Resolution: | Keywords: TypeInType Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: GHC rejects | Test Case: valid program | dependent/should_compile/T11719 Blocked By: | Blocking: Related Tickets: #13913 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by int-index): Replying to [comment:14 goldfire]:
These two declarations have quite different meanings:
{{{#!hs type family F1 :: k -> Type type family F2 :: forall k. k -> Type }}}
`F1` takes one argument, `k`. `F2`, on the other hand, takes no arguments. `F1` can match on `k`, returning constructors of different kinds in different instances. On the other hand, `F2` must return a
This statement doesn't sit well with me. I expect to be able to introduce any type variable explicitly, and `F1` with an explicit `forall` for `k` turns out to be `F2`. These declarations ''must'' have the same meaning. Let's compare to term-level functions: {{{#!hs f :: k -> Type f :: forall k. k -> Type }}} These types are the same (modulo specificity of `k`)! polykinded constructor, and can have only one instance. So you mean that we treat `F1` as having kind `pi k. k -> Type`, while `F2` has kind `forall k. k -> Type`: `F1` can match on its parameter `k` and `F2` cannot. Why? I thought we always treat `forall` as `pi` in kinds, at least for now. Therefore, I agree with Ryan's expectations in comment:13. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11719#comment:17 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler