[GHC] #8828: allow fully applied type families in instance heads
GHC
ghc-devs at haskell.org
Mon Jun 2 16:50:44 UTC 2014
#8828: allow fully applied type families in instance heads
-------------------------------------+------------------------------------
Reporter: aavogt | Owner: goldfire
Type: feature request | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.6.2
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture: Unknown/Multiple
Type of failure: None/Unknown | Difficulty: Unknown
Test Case: | Blocked By:
Blocking: | Related Tickets:
-------------------------------------+------------------------------------
Comment (by goldfire):
I've thought about this ticket some, and I think implementing this idea is
a move in the wrong direction.
Implementing this idea feels quite like allowing function applications in
patterns. For example, how would we feel about this:
{{{
foo :: Bool -> Int
foo True = 1
foo (not True) = -1
}}}
With some engineering, there is no reason that we couldn't accept a
definition such as the one above. After all, `not True` is fully applied
to constants and can be reduced to `False`. We can pretend that there is a
TH-like stage restriction (somewhat like Simon's quite valid dependency
concerns in comment:1) to prevent infinite regress. We can even check to
make sure that the pattern match is complete. Yet, this definition smells
like rotten eggs to me.
Should it be different at the type level? I, personally, think not.
What it seems we really want here are ''type pattern synonyms''. Pattern
synonyms allow a richer syntax "on the left of an `=`", which is what we
want here in types. It so happens that, currently, type patterns are
syntactically just types that don't mention type families, but if we
separate out a type pattern syntax from a type syntax (which I think is a
good idea -- they are different!) then the idea of type families "on the
left" becomes even more suspicious and type pattern synonyms make more
sense.
So, instead of implementing the idea proposed here, I would rather think
about type pattern synonyms. How are these related to term pattern
synonyms? How would we declare them? Can they be promoted to kinds? etc.
What do others think here?
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8828#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list