| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Data.HList.RecordPuns
Description
- pun :: QuasiQuoter
Documentation
>>>:set -XQuasiQuotes -XViewPatterns
patterns
>>>let y = Label :: Label "y">>>let x = Label :: Label "x">>>[pun| x y |] <- return (x .=. 3 .*. y .=. "hi" .*. emptyRecord)>>>print (x,y)(3,"hi")
expressions
Compare with the standard way to construct records above
>>>let x = 3; y = "hi">>>[pun|x y|]Record{x=3,y="hi"}
nesting
Nesting is supported. The idea is that variables inside
{ } are in another record. More concretely:
[pun| ab@{ a b } y z c{d} |]as a pattern, it will bindings from an original record x,
if you interpret (.) as a left-associative field lookup (as it
is in other languages):
let ab = xab
a = x.ab.a
b = x.ab.b
y = x.y
z = x.z
-- c is not bound
d = x.c.das an expression, it creates a new record which needs the variables
ab a b y z d in-scope. ab needs to be a record, and if it has
fields called a or b they are overridden by the values of a and b
which are in scope.
( ) parens mean the same thing as { }, except the pattern match
restricts the fields in the record supplied to be exactly the ones
provided. In other words
[pun| (x _ y{}) |] = list
-- desugars to something like:
Record ((Tagged x :: Tagged "x" s1) `HCons`
(Tagged _ :: Tagged t s2) `HCons`
(Tagged _ :: Tagged "y" s3) `HCons`
HNil) = listWhere the s1 and s2 are allowed to fit whatever is in the HList.
Note that this also introduces the familiar wild card pattern (_),
and shows again how to ensure a label is present but not bind a variable
to it.
See also examples/pun.hs. In {} patterns, pun can work with
Variant too.
pun :: QuasiQuoter Source #
requires labels to be promoted strings (kind Symbol), as provided by
Data.HList.Label6 (ie. the label for foo is Label :: Label "foo"),
or Data.HList.Labelable