Skip to content
  • Gergő Érdi's avatar
    Implement pattern synonyms · 4f8369bf
    Gergő Érdi authored
    This patch implements Pattern Synonyms (enabled by -XPatternSynonyms),
    allowing y ou to assign names to a pattern and abstract over it.
    
    The rundown is this:
    
      * Named patterns are introduced by the new 'pattern' keyword, and can
        be either *unidirectional* or *bidirectional*. A unidirectional
        pattern is, in the simplest sense, simply an 'alias' for a pattern,
        where the LHS may mention variables to occur in the RHS. A
        bidirectional pattern synonym occurs when a pattern may also be used
        in expression context.
    
      * Unidirectional patterns are declared like thus:
    
            pattern P x <- x:_
    
        The synonym 'P' may only occur in a pattern context:
    
            foo :: [Int] -> Maybe Int
            foo (P x) = Just x
            foo _     = Nothing
    
      * Bidirectional patterns are declared like thus:
    
            pattern P x y = [x, y]
    
        Here, P may not only occur as a pattern, but also as an expression
        when given values for 'x' and 'y', i.e.
    
            bar :: Int -> [Int]
     ...
    4f8369bf