[GHC] #13262: Allow type synonym family application in instance head if it reduces away

GHC ghc-devs at haskell.org
Fri Feb 24 22:32:49 UTC 2017


#13262: Allow type synonym family application in instance head if it reduces away
-------------------------------------+-------------------------------------
        Reporter:  ezyang            |                Owner:  (none)
            Type:  feature request   |               Status:  new
        Priority:  low               |            Milestone:
       Component:  Compiler (Type    |              Version:  8.0.1
  checker)                           |
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by ezyang):

 * priority:  lowest => low


Comment:

 Actually, I realized that something stronger would be OK here: it's OK for
 a type family synonym to occur in an instance, even if it doesn't reduce
 away, AS LONG AS the expression has no free variables.

 This is pretty useless for normal programmers but actually it is pretty
 useful in Backpack. Consider:

 {{{
 -- there's some type family F a :: * -> *
 data T
 instance Monad (F T) where ...
 }}}

 This is something that I'd really quite like to write in a signature,
 because what I am saying is that there is some existing type family F, and
 whatever it is the abstract type you picked, F T better reduce to a monad.
 Yes I could replace the type family with another abstract type for the
 monad, but if I want Backpack and the type family to coexist, I get better
 backwards compatibility by reusing the type family.

 The analogy is how we handle type families in constraints:

 {{{
 f :: Monad (F a) => ....
 }}}

 This is OK because `a` is a skolem variable, so we aren't ever going to
 instantiate it to some variable while we're typechecking the body of f.
 What would be wrong, and is impossible to write in Haskell's type language
 today, is `f :: (forall a. Monad (F a)) => ...`!

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13262#comment:5>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list