= Polymorphic record patterns ('''''speculative''''' future) = John Meacham has requested the ability to put polymorphic record syntax in a pattern. http://www.haskell.org/pipermail/glasgow-haskell-users/2012-February/021918.html Without trying to match his request exactly, here's a possible desugarring within the DORF framework. (I am __not__ suggesting this gets implemented until we've more experience with DORF.) Syntax like this in a pattern: {{{ case r of { r{customer_id, firstName, lastName } -> ... customer_id ... } }}} Note: * there's a lower-case name prefix to the `{ ... }` body, so this is __not__ a data constructor * this is an irrefutable name binding, not really a pattern * (That is, if `r` doesn't happen to have all those fields, we'll just fail to compile, we won't try to go on to the next case branch.) * This example is using '''-XNamedFieldPuns''', we could also use the `{ blah = foo }` syntax John gives. The obvious way to desugar: {{{ let { customer_id = customer_id r; ... in { ... customer_id ...} }}} won't work because we get name capture inside the let declarations. (The dangers of punning!) So it'll have to be: {{{ let { customer_id_via = customer_id r; ... } in { let { customer_id = customer_id_via; ... } in { ... customer_id ...} }}} [Implementor's note: can we improve this?] Within the body we can indeed use polymorphic record update syntax to reconstitute the record: {{{ ... r{ lastName = map toUpper lastName } ... }}} Note that since there's no data constructor, this will continue `r`'s existing data constructor.