Does GHC simplify RULES?

Josef Svenningsson josefs@cs.chalmers.se
Thu, 21 Feb 2002 16:24:04 +0100 (MET)


Hi!

A question about the RULES pragma.

Suppose I have the following RULES pragma:

{-# RULES
  "foo" forall a . foo a = (\x -> bar x) a
#-}

Ok, it's stupid but I have examples where this is motivated, trust me.

Now, it seems that GHC simplifies the rule because what I get when
compiling it with -ddump-rules is the following rule:

"foo" __forall {@ t_a2UD a :: t_a2UD}
	Test.foo @ t_a2UD a
	= Test.bar @ t_a2UD a ;

It's \beta-reduced! Argh! Why is that?

So why is this a problem? Maybe I should give some explanation. The reason
is that I want to put a type signature on the (\x -> bar x) and make it
more general (i.e. forcing GHC to insert a type lambda after a lambda). I
then have other rules which match on higher ranked types. But in order for
these rules to apply the type lambda must be in the right place.

One other thing I tried in order to get the type lambdas on the right
place was to use rank 1 types (is that the correct name?):

xyzzy :: (a -> a) -> (forall b. b -> b)

but GHC simplified the type and just put the forall quantified (and hence
the type lambda) on the top level. Argh again!

Is there a way around this?

	/Josef