[GHC] #6018: Injective type families
GHC
ghc-devs at haskell.org
Wed May 7 21:08:56 UTC 2014
#6018: Injective type families
-------------------------------+-------------------------------------------
Reporter: lunaris | Owner: simonpj
Type: feature | Status: new
request | Milestone: 7.10.1
Priority: normal | Version: 7.4.1
Component: Compiler | Keywords: TypeFamilies, Injective
Resolution: | Architecture: Unknown/Multiple
Operating System: | Difficulty: Unknown
Unknown/Multiple | Blocked By:
Type of failure: | Related Tickets: #4259
None/Unknown |
Test Case: |
Blocking: |
-------------------------------+-------------------------------------------
Comment (by MikeIzbicki):
Here's a real worldish use case.
Let's try to write a modified Functor class that lets us map over not just
the last type variable, but any type variable. This would be useful, for
example, with the Either type.
The class might look something like:
{{{
class Functor loc f where
fmap :: proxy loc -> (a -> b) -> SetLocation f loc a -> SetLocation f
loc b
}}}
Where loc is a type that uniquely identifies the position of the argument
we want to map over. We can't make an instance of this class unless the
SetLocation type family is injective.
With a little syntactic sugar, we can convert the above class into
something that looks very much like the current Functor class, but is
quite a bit more powerful:
{{{
class Functor loc f where
fmap :: proxy loc -> (a -> b) -> f { loc = a } -> f { loc = b }
}}}
I don't think you can get something nearly that clean without injective
type families. And, of course, this applies to any parametric classes
currently in use, not just Functor.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/6018#comment:25>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list