Skip to content
  • Ryan Scott's avatar
    Disallow bang/lazy patterns in the RHSes of implicitly bidirectional patsyns · 5dd6b13c
    Ryan Scott authored
    Summary:
    GHC was allowing implicitly bidirectional pattern synonyms with bang
    patterns and irrefutable patterns in the RHS, like so:
    
    ```lang=haskell
    pattern StrictJust a = Just !a
    ```
    
    This has multiple problems:
    
    1. `Just !a` isn't a valid expression, so it feels strange to allow it in an
       implicitly bidirectional pattern synonym.
    2. `StrictJust` doesn't provide the strictness properties one would expect
       from a strict constructor. (One could imagine a design where the
       `StrictJust` builder infers a bang pattern for its pattern variable, but
       accomplishing this inference in a way that accounts for all possible
       patterns on the RHS, including other pattern synonyms, is somewhat
       awkward, so we do not pursue this design.)
    
    We nip these issues in the bud by simply disallowing bang/irrefutable patterns
    on the RHS.
    
    Test Plan: make test TEST="T14112 unidir"
    
    Reviewers: simonpj, austin, bgamari
    
    Reviewed By: simonpj
    
    Subscribers: rwbarton, thomie
    
    GHC Trac Issues: #14112
    
    Differential Revision: https://phabricator.haskell.org/D3896
    5dd6b13c