Skip to content
  • Edward Z. Yang's avatar
    Add 'DeBruijn' constructor, which generalizes "key modulo alpha-renaming." · ccef0146
    Edward Z. Yang authored
    
    
    Summary:
    We need equality over Types, etc; and this equality has to be modulo alpha
    renaming. Previously, we baked CmEnv into the generic "empty, singleton, many"
    structure. This isn't great, really GenMap should be more generic than that.
    
    The insight: we've defined the key wrong: the key should be *equipped*
    with the alpha-renaming information (CmEnv) and a TrieMap queried with this.
    This is what the DeBruijn constructor does.
    
    Now, when we define TrieMap instances, we don't have to synthesize an emptyCME
    to pass to the helper functions: we have all the information we need. To make a
    recursive call, we construct a new DeBruijn with the updated CME and then
    call lookupTM on that. We can even define a plain old Eq instance on DeBruijn
    respecting alpha-renaming.  There are number of other good knock-on effects.
    
    This patch does add a bit of boxing and unboxing, but nothing the optimizer
    shouldn't be able to eliminate.
    
    Signed-off-by: default avatarEdward Z. Yang <ezyang@cs.stanford.edu>
    
    Test Plan: validate
    
    Reviewers: simonpj, austin
    
    Subscribers: carter, thomie
    
    Differential Revision: https://phabricator.haskell.org/D608
    
    GHC Trac Issues: #9960
    ccef0146