
hat-trans is generating bad code for this, because the pattern binding is at the toplevel. If the pattern binding were in a let or where clause, the generated code is different. When not at the toplevel, the parent, p, of the binding is always a variable passed in. But at the toplevel, there is no static parent, so hat-trans has wrongly substituted T.mkRoot (which explicitly represents no parent), in both the generated pattern and the generated expression:
gx px T.mkRoot = T.constUse px T.mkRoot sx -- incorrect vs. gx px p = T.constUse px p sx -- correct
I think the attached patch for hat-trans should fix the problem (but would like someone to confirm this is not going to break anything else, before I will commit it to CVS).
You are absolutely right. I just committed it to CVS. Ciao, Olaf