[GHC] #13733: Simplify constraints on RULES LHS
GHC
ghc-devs at haskell.org
Mon May 22 22:16:45 UTC 2017
#13733: Simplify constraints on RULES LHS
-------------------------------------+-------------------------------------
Reporter: nomeata | Owner: (none)
Type: feature request | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.3
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: |
-------------------------------------+-------------------------------------
Comment (by nomeata):
Oh, yes, the library author can! But someone downstream does not have the
ability to change the
{{{
instance Eq [a] where
x == y = rhs
}}}
to the above format.
Similarly if they want to write
{{{
data T = … deriving Show
}}}
In both cases I would consider consider your approach an work-around that,
well, works around the fact that an instance method does not have a
Haskell-adressable name.
So what am I proposing?… now, before I propose something, let me phrase
clearly what I want to achieve: **I want to write rules that apply to an
instance method.**
(Your approach does not quite achieve that. What it does achieve is that I
no longer want to address instance methods, as I can now adress `eqT`,
which works fine in many cases. But this does not work if the instance
declaration is out of my control.)
There may be several ways of achieving this goal. One way would be:
**Simplify constraints of rules with the current instances and apply
class-op rules on the LHS of rules.**
This way, the user’s rule
{{{
forall (xs :: [Integer]). xs == xs = True
}}}
gets desugared to
{{{
forall (xs_a1Hd :: [Integer]).
== @ [Integer] ($fEq[] @ Integer $fEqInteger) xs_a1Hd xs_a1Hd
= GHC.Types.True
}}}
(compare that with the rule above, which has a pattern variable $dEq_a1Jv
for the `Eq [Integer]` dictionary), and then gentle simplification
(including class-op) on the left turns this into
{{{
forall (xs_a1Hd :: [Integer]).
GHC.Classes.$fEq[]_$c== @Integer $fEqInteger xs_a1Hd xs_a1Hd
= GHC.Types.True
}}}
which – how convenient – is precisely the code we want to match, in the
form the simplifier puts it.
This machinery should allow the rule author to address any concrete
instance method, in his module or an imported module, by using the class
method with a sufficiently precise type.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13733#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list