[GHC] #11080: Open data kinds

GHC ghc-devs at haskell.org
Wed Nov 18 12:29:33 UTC 2015


#11080: Open data kinds
-------------------------------------+-------------------------------------
        Reporter:  dmcclean          |                Owner:  jstolarek
            Type:  feature request   |               Status:  new
        Priority:  low               |            Milestone:
       Component:  Compiler          |              Version:
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #6024             |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by jstolarek):

 * owner:   => jstolarek
 * related:   => #6024


Comment:

 Note that we also have #6024 (and its wiki page
 [[wiki:GhcKinds/KindsWithoutData]]), which is about implementing close
 data kinds without the need for declaring a data type.  Can we implement
 this and #6024 at the same time?  It seems to me that the answer is yes.

 Here is my proposal for the syntax:

 {{{#!hs
 -- (1) closed kinds, normal syntax
 kind Universe = Sum  Universe Universe
               | Prod Universe Universe
               | K *

 -- (2) closed kinds, GADT syntax.
 kind Universe where
    Sum  :: Universe -> Universe -> Universe
    Prod :: Universe -> Universe -> Universe
    K    :: *                    -> Universe

 -- (3) open kinds
 kind Universe
 kind instance Sum  :: Universe -> Universe -> Universe
 kind instance Prod :: Universe -> Universe -> Universe
 kind instance K    :: *                    -> Universe
 }}}

 This syntax would steal `kind` as a keyword. Do we feel bad about it?
 Importantly, do we put this new feature into its own language extension or
 do we make it part of `DataKinds`? If the former then I don't feel bad
 about stealing `kind`, as we won't break any of the existing code. But if
 we put this into `DataKinds` then I might reconsider my preference for
 syntax. Then again I still would rather break backwards compatibility and
 have nice syntax then construct verbose syntax for the sake of backwards
 compatibility.  Also, I don't like `data constructor` syntax.  I find it
 misleading as data constructor is a totally different thing than what we
 are declaring (in fact, in #6024 we specifically wish to avoid creating
 data constructors).

 If we made this into a separate language extension, I wonder if that
 extension would have to be enabled only in modules that declare kinds or
 also in the ones that use them?

 How does this feature interact with `* :: *`? In #6024 dreixel says: "[in
 the future] types and kinds might be collapsed into a single level. That
 would also destroy the possibility of doing what is asked in this ticket,
 though." I believe that dreixel's line of reasoning was this:

 > When we declare `kind K = T`, then `K` is a kind a `T` is a type. But
 since types and kinds are now the same then we must be able to treat `K`
 as a type, which makes `T` a value and thus we arrived at declaring a data
 type.

 If this was what dreixel meant then I disagree with it. It's like saying
 that since `Int :: *`, then `*` can be treated as a type and thus `Int`
 can be treated as a value (whatever that would mean).

 Another question related to `* :: *` is about namespace collision. If I
 say:

 {{{#!hs
 -- assume DataKinds are enabled, so that C becomes a type
 data T = C

 kind K = T | C
 }}}
 do we have collisions beetwen definitions of `T`s and `C`s?  They are all
 in namespace of types. On the other hand they could be disambiguated by
 kind, but I'm not sure if this is acceptable.

 Aside: if we can index kinds does this mean we have sort polymorphism?

 I will work on extending [[wiki:GhcKinds/KindsWithoutData]] wiki page, as
 I think this discussion belongs there (even if closed and open kinds
 should be implemented separately). Yell if you think otherwise.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11080#comment:6>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list