Skip to content
  • Simon Peyton Jones's avatar
    Refactor typechecking of pattern bindings · 45bfd1a6
    Simon Peyton Jones authored
    This patch fixes a regression introduced, post 8.0.1, by
    this major commit:
    
         commit 15b9bf4b
         Author: Simon Peyton Jones <simonpj@microsoft.com>
         Date:   Sat Jun 11 23:49:27 2016 +0100
    
             Improve typechecking of let-bindings
    
             This major commit was initially triggered by #11339, but it
             spiraled into a major review of the way in which type
             signatures for bindings are handled, especially partial type
             signatures.
    
    I didn't get the typechecking of pattern bindings right, leading
    to Trac #12427.
    
    In fixing this I found that this program doesn't work:
    
      data T where
        T :: a -> ((forall b. [b]->[b]) -> Int) -> T
    
      h1 y = case y of T _ v -> v
    
    Works in 7.10, but not in 8.0.1.
    
    There's a happy ending. I found a way to fix this, and improve
    pattern bindings too.  Not only does this fix #12427, but it also
    allows
    
    In particular,we now can accept
    
      data T where MkT :: a -> Int -> T
    
      ... let { MkT _ q = t } in ...
    
    Previously this elicited "my head exploded" but it's really
    fine since q::Int.
    
    The approach is described in detail in TcBinds
       Note [Typechecking pattern bindings]
    Super cool.  And not even a big patch!
    45bfd1a6