[GHC] #15905: Data familes should end in Type

GHC ghc-devs at haskell.org
Mon Jan 14 17:55:46 UTC 2019


#15905: Data familes should end in Type
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.6.2
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #14645            |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by RyanGlScott):

 I'm not Icelandic, but I can provide one "real-world" use case for this
 feature from the `singletons` library. It used to be the case that we had
 about eight or so data types of this shape:

 {{{#!hs
 data TyCon1 :: (k1 -> k2) -> (k1 ~> k2)
 data TyCon2 :: (k1 -> k2 -> k3) -> (k1 ~> k2 ~> k3)
 data TyCon3 :: (k1 -> k2 -> k3 -> k4) -> (k1 ~> k2 ~> k3 ~> k4)
 data TyCon4 :: (k1 -> k2 -> k3 -> k4 -> k5) -> (k1 ~> k2 ~> k3 ~> k4 ~>
 k5)
 data TyCon5 :: (k1 -> k2 -> k3 -> k4 -> k5 -> k6)
             -> (k1 ~> k2 ~> k3 ~> k4 ~> k5 ~> k6)
 data TyCon6 :: (k1 -> k2 -> k3 -> k4 -> k5 -> k6 -> k7)
             -> (k1 ~> k2 ~> k3 ~> k4 ~> k5 ~> k6 ~> k7)
 data TyCon7 :: (k1 -> k2 -> k3 -> k4 -> k5 -> k6 -> k7 -> k8)
             -> (k1 ~> k2 ~> k3 ~> k4 ~> k5 ~> k6 ~> k7 ~> k8)
 data TyCon8 :: (k1 -> k2 -> k3 -> k4 -> k5 -> k6 -> k7 -> k8 -> k9)
             -> (k1 ~> k2 ~> k3 ~> k4 ~> k5 ~> k6 ~> k7 ~> k8 ~> k9)
 }}}

 We arbitrarily capped off the maximum at eight. With the advent of
 polymorphic data family return kinds, however, we were able to consolidate
 all of this down into just three things:

 {{{#!hs
 data family TyCon :: (k1 -> k2) -> unmatchable_fun

 type family ApplyTyCon (f :: k1 -> k2) (x :: k1) :: k3 where
   ApplyTyCon (f :: k1 -> k2 -> k3) x = TyCon (f x)
   ApplyTyCon f x                     = f x

 type instance Apply (TyCon f) x = ApplyTyCon f x
 }}}

 Now we don't need to copy-paste `TyCon` multiple times, and better yet, we
 don't have to arbitrarily set a maximum of eight, since `ApplyTyCon` lets
 us go to whatever arity we desire.

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


More information about the ghc-tickets mailing list