Portability | GHC>=7 -XTemplateHaskell, -XViewPatterns |
---|---|

Stability | experimental |

Maintainer | Adam Vogt <vogt.adam@gmail.com> |

Safe Haskell | None |

Quasiquoter for *or patterns* separated by `" | "`

, like other languages
(ML family).

Example:

`>>>`

`:set -XQuasiQuotes -XViewPatterns -w`

`>>>`

`:{`

`>>>`

`let f :: Either (a,b) (b,a) -> (a,b)`

`>>>`

`f [o| Left (x,y) | Right (y,x) |] = (x,y)`

`>>>`

`:}`

`>>>`

[('a',0),('b',2)]`map f [Left ('a',0), Right (2, 'b')]`

A more confusing example (to show that the string | is interpreted correctly by the parser):

`>>>`

`:{`

`>>>`

`let g [o| " | " | "|||" | " | " |] = True`

`>>>`

`g _ = False`

`>>>`

`:}`

`>>>`

[False,True,True,True]`map g [ "|", " | " , "|||" , " | "]`

f is desugared to something like:

f ( (\v -> case v of Left (x,y) -> Just (x,y) Right (y,x) -> Just (x,y) _ -> Nothing ) -> Just (x,y) ) = (x,y)

So failing to match will pass on to the next equation.

Limitations include:

- compilation could probably be more efficient
- incorrect patterns, such as those binding the wrong variables or the wrong number of variables could be reported better
- generated code can have overlapped patterns, and so -Wall doesn't help the
above example. Duplicating or using ghc's check for this should be done,
in which case the the desugared code should look like
*f2*.

f2 ( (\v -> case v of Left (x,y) -> (x,y) Right (y,x) -> (x,y)) -> a) = a

- o :: QuasiQuoter

# Documentation

or pattern quasiquote. See above.