[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