Uniquable RdrName instance

Jan Stolarek jan.stolarek at p.lodz.pl
Mon Jun 16 19:33:06 UTC 2014


> Why do you want this? The danger I see lurking is that you might find two
> RdrNames that give the same answer to getUnique but represent different
Yes, that's exactly my concern.

> Why do you want this?
I'm working on #7282 - RebindableSyntax and Arrows. Here's a snippet from desugaring of arrow 
notation:

leaves = concatMap leavesMatch matches
 where
   leavesMatch :: LMatch Id (Located (body Id)) -> [(Located (body Id), IdSet)]
   leavesMatch (L _ (Match pats _ (GRHSs grhss binds)))
         = let defined_vars = mkVarSet (collectPatsBinders pats) `unionVarSet`
                                          mkVarSet (collectLocalBinders binds)
             in  [(body, mkVarSet (collectLStmtsBinders stmts) `unionVarSet` defined_vars) | L _ 
(GRHS stmts body) <- grhss]

This is in the desugarer. But I need to also know `length leaves` at the renaming stage, which 
means I need to call `concatMap leavesMatch matches`. The problem is that in the renamer my 
datatypes are not parametrised by `Id`. I turned `Id` into a type parameter `id`, but then I 
can't use VarSets. I could use more general UniqueSets but only if `id` type parameter is an 
instance of Uniquable. And since in the renamer the datatypes are parametrized with RdrName this 
leads me to wanting Uniqable RdrName instance.

Janek


More information about the ghc-devs mailing list