[Haskell-cafe] Some thoughts on Type-Directed Name Resolution

Donn Cave donn at avvanta.com
Fri Feb 10 07:03:52 CET 2012


Quoth Evan Laforge <qdunkan at gmail.com>,
> On Thu, Feb 9, 2012 at 12:49 PM, Donn Cave <donn at avvanta.com> wrote:
...
>> For example, in a better world you could write stuff like
>>
>>   modifyConfig :: (Config -> a) -> (a -> a) -> Config -> Config
>>   modifyConfig fr fv a = a { fr = fv (fr a) }
>>
>>   upTempo config = modifyConfig tempo (+ 20) config
>
> I think lenses already do better than this, since not only are they
> more concise than the above (once you've resigned yourself to a few TH
> splices), they aren't restricted to being only record fields.

How more concise?  Because =# is more concise than `modifyRecord', etc.,
or is there some real economy of expression I missed out on?  Asking
because, honestly I didn't get your earlier example -

setTempo :: Config -> Config
setTempo y = Config.deflt#Config.tempo =# y

... something's missing, I thought - but maybe it's conciser than
I can reckon with!

The rest - the functions that look like fields, the enforcing invariants,
etc. - are cool as lens features, but for Haskell records in general it
seems like something that would call for a lot of discussion.  Compared
to first class record update, where it's easy to see how close to broken
the current situation is.

	Donn



More information about the Haskell-Cafe mailing list