[Haskell-cafe] Syntax for modifying nested product types

Graham Klyne GK at ninebynine.org
Fri Apr 23 17:40:40 EDT 2004


At 18:18 22/04/04 -0400, Mark Carroll wrote:
>I have data objects where each component is a labelled field through which
>I access or modify it.

Wading into the labelled field debate...

I have found that using the labelled field update syntax can lead to 
difficulties in changing the underlying implementation of a type.

I found this in particular when re-implementing the Network.URI module:  I 
found that I needed to change the internal representation of the URI type 
in order to satisfy the recently clarified URI specification.  The knock-on 
effect of this was mitigated to some extent by implementing the original 
field names as functions to extract values corresponding to the original 
components.  But I found when porting the HXml Toolbox and/or HTTP code to 
use this new implementation that while field references would still work as 
intended, occurrences of the field update syntax had to be re-coded;  there 
remained external dependencies on the internal structure of URI that could 
not be "shimmed" away with new functions.

This leads me to ask, if new syntax approaches for labelled fields are 
being considered, if it would be possible to adopt an approach in which the 
field name works like a function for both access *and* updating of a field 
record.

A clumsy example of this might be a field name used as a query-and-set 
function:

data record { field :: atype, ... }

yields

field :: record -> (atype -> atype) -> (record,atype)

then

arecord :: record
arecord = ...

fval = snd field arecord id              -- returns value of field
rval = fst field arecord (const newval)  -- returns updated record

(this is to illustrate a desideratum, not a serious suggestion.  Something 
is tickling the back of my mind about possibly doing this with a Monad.)

With a field name working as a function (the same function) for both access 
and update, it is then possible to change the internal structure of a 
record yet retain the possibility of presenting a backwards-compatible 
interface.

#g


------------
Graham Klyne
For email:
http://www.ninebynine.org/#Contact



More information about the Haskell-Cafe mailing list