Refactor free tyvars on LHS of rules
authorSimon Peyton Jones <simonpj@microsoft.com>
Fri, 22 Apr 2016 09:47:14 +0000 (10:47 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Fri, 22 Apr 2016 10:32:42 +0000 (11:32 +0100)
commit6ad2b42f866fa718855cc5c850e3549bc1428b3c
treee1ffe1ed7dcb8ce6a6a1abc4a73fa02f1d989eee
parent970ff585489285f527a098983538cd48f93ab245
Refactor free tyvars on LHS of rules

A RULE can have unbound meta-tyvars on the LHS.  Consider
  data T a = C

  foo :: T a -> Int
  foo C = 1

  {-# RULES "myrule"  foo C = 1 #-}

After type checking the LHS becomes (foo alpha (C alpah)) and we do
not want to zap the unbound meta-tyvar 'alpha' to Any, because that
limits the applicability of the rule.  Instead, we want to quantify
over it!

Previously there was a rather clunky implementation of this
quantification, buried in the zonker in TcHsSyn (zonkTvCollecting).

This patch refactors it so that the zonker just turns the meta-tyvar
into a skolem, and the desugarer adds the quantification.  See DsBinds
Note [Free tyvars on rule LHS]. As it happened, the desugarer was
already doing something similar for dictionaries. See DsBinds
Note [Free dictionaries on rule LHS]

No change in functionality, but less cruft.
compiler/deSugar/DsBinds.hs
compiler/typecheck/TcHsSyn.hs