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)
>>>
:}
>>>
map f [Left ('a',0), Right (2, 'b')]
[('a',0),('b',2)]
A more confusing example (to show that the string | is interpreted correctly by the parser):
>>>
:{
>>>
let g [o| " | " | "|||" | " | " |] = True
>>>
g _ = False
>>>
:}
>>>
map g [ "|", " | " , "|||" , " | "]
[False,True,True,True]
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.