[GHC] #6018: Injective type families
GHC
ghc-devs at haskell.org
Thu Sep 18 05:59:23 UTC 2014
#6018: Injective type families
-------------------------------------+-------------------------------------
Reporter: lunaris | Owner: jstolarek
Type: feature | Status: new
request | Milestone: 7.10.1
Priority: normal | Version: 7.4.1
Component: Compiler | Keywords: TypeFamilies,
Resolution: | Injective
Operating System: | Architecture: Unknown/Multiple
Unknown/Multiple | Difficulty: Unknown
Type of failure: | Blocked By:
None/Unknown | Related Tickets: #4259
Test Case: |
Blocking: |
Differential Revisions: Phab:D202 |
-------------------------------------+-------------------------------------
Comment (by jstolarek):
A nice syntax proposal showed up on Haskell-cafe. The idea is to allow
user to actually introduce a variable that names the result:
{{{#!hs
type family Id a :: (result :: *) | result -> a where
type family F a b c :: (d :: *) | d -> a b c
type family G a b c :: (foo :: *) | foo-> a b where
type family Plus a b :: (sum :: Nat) | sum a -> b, sum b -> a where
type family H a b c :: (xyz :: *) | xyz a -> b c, xyz b -> a c
}}}
No new keywords, so we get full backwards compatibility. I'm only
wondering how this would interact with kind signatures for the result,
which we allow now. Above I assumed that if a programmer wants to name the
result she must supply a kind annotation. This might be a bit
inconvenient. On the other hand I think that the range of possible names
for type variables and kinds is disjoint, so we may actually guess whether
the user means the kind of the result or its name by looking whether the
identifier is capitalized. So we could just write:
{{{#!hs
type family Id a :: result | result -> a where
type family F a b c :: d | d -> a b c
type family G a b c :: foo | foo-> a b where
type family Plus a b :: sum | sum a -> b, sum b -> a where
type family H a b c :: xyz | xyz a -> b c, xyz b -> a c
}}}
The only caveat I see is that user might accidentally write `type family
Plus a b :: nat` instead of `type family Plus a b :: Nat` and then get
some weird compilation errors if the kind signature was essential to make
the code compile. Still, I like this proposal best of all made so far.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/6018#comment:68>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list