first-class-patterns- First class patterns and pattern matching, using type families

MaintainerBrent Yorgey <>
Portabilitynon-portable (see .cabal)
Safe HaskellNone



The main module for first-class-patterns; to use the library it should suffice to import this module. For a quick start using the library, see the examples below.

If you want to read further, start with Data.Pattern.Base, which defines the basic pattern type and some basic combinators. Then read Data.Pattern.Common, which defines a number of convenient combinators for constructing various sorts of patterns.

As an example, the following functions, ex1 and ex2, are semantically equivalent:

 ex1, ex2 :: Num a => Either a (a, a) -> a
 ex1 a = match a $
           left (cst 4)         ->> 0
       <|> left var             ->> id
       <|> right (tup2 var var) ->> (+)
 ex2 a = case a of
           Left 4      -> 0
           Left x      -> x
           Right (x,y) -> x+y

Also, when optimisation is turned on, GHC will compile them to the same code.

XXX add more examples here.