[GHC] #6018: Injective type families
GHC
ghc-devs at haskell.org
Sun Feb 8 01:39:19 UTC 2015
#6018: Injective type families
-------------------------------------+-------------------------------------
Reporter: lunaris | Owner: jstolarek
Type: feature request | Status: new
Priority: normal | Milestone: 7.12.1
Component: Compiler | Version: 7.4.1
Resolution: | Keywords:
Operating System: Unknown/Multiple | TypeFamilies, Injective
Type of failure: None/Unknown | Architecture:
Blocked By: | Unknown/Multiple
Related Tickets: #4259 | Test Case:
| Blocking:
| Differential Revisions: Phab:D202
-------------------------------------+-------------------------------------
Comment (by goldfire):
Replying to [comment:105 dorchard]:
> what about adding a kind of injectives `>->`? e.g.`* >-> *`is the kind
of injective type functions
This is very much along the lines of what Jan and I proposed in our
"Promoting Functions to Type Families" paper
([http://www.cis.upenn.edu/~eir/papers/2014/promotion/promotion.pdf
here]). But, there is some subtlety.
GHC assumes all function types (that is, types with kinds that are headed
by `->`) are ''generative'' and ''injective''. Generativity means that,
given `a b ~ c d`, you can conclude `a ~ c`. Injectivity means that, given
`a b ~ a d`, you can conclude `b ~ d`. Indeed, putting these together and
assuming `a b ~ c d`, you can conclude `b ~ d`. Thus, the kind `->`
denotes a generative, injective function.
We could imagine a new classifier `~>` that denotes an ordinary function,
with no assumptions. GHC would then be careful not to decompose such
things. This is exactly the situation today with type families. Note that,
short of GHCi's `:kind` command, there is no way to work with the kind of
an unapplied type family. If I say `type family F (a :: *) :: *`, we often
colloquially say that `F :: * -> *`, but there is no way to use this
knowledge in a Haskell program, because `F` can never appear unsaturated.
Thus, it is more accurate to say that `F` is just ill-formed, and `F a ::
*` as long as `a :: *`.
All of this is to say that the new arrow would have to denote
''non''-injective functions. And, I could easy say that GHC today supports
such a thing, because there's no way to take advantage of it anyway.
What we really need in this direction is unsaturated type functions, but
that's a story for another day. (A story I'd love to think more about...
on that other day!)
So, taking all of this into account, dorchard's proposal is a different
syntax for denoting injectivity, and I personally prefer the functional-
dependency-like one more.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/6018#comment:108>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list