[Haskell] Proposal: Allow "\=" for field update in record update
syntax
Hal Daume III
hdaume at ISI.EDU
Thu Feb 17 13:15:54 EST 2005
There was a long discussion of these issues a while back under the title
'updating labelled fields'. The most recent message was from SPJ:
http://www.haskell.org//pipermail/glasgow-haskell-users/2002-May/003374.html
You should probably take a look at the whole thread...
On Thu, 17 Feb 2005, S. Alexander Jacobson wrote:
> I don't know what it takes to get this sort of change into
> circulation, but I assume it starts with a clear and specific
> description of the problem, exploration of alternatives, and a
> specific proposed solution. So here goes:
>
> ----------
> Proposal: Allow "\=" for field update in record update syntax
>
> Specifically, intepret
>
> rec {field\=fn}
>
> as
>
> rec {field = fn (field rec)}
>
> Jusitification:
>
> It is extremely common when updating records to be updating a field
> value based on its prior value rather than simply assigning a new
> value from nothing. Unforunately the syntax supports the later
> clearly but makes the former awkward to read, understand, and debug:
>
> myFun db myType1 =
> db { tMyType1 = insert myType1 $ tMyType1 db
> nextId = 1 + (nextId db)
> }
>
> One solution to this problem that does not involve changing syntax is
> to generate field update functions for every field of a type e.g.:
>
> update_tMyType1 f s = s {tMyType1= f $ myType1 s}
> update_nextId f s = s {nextId = f $ nextId s}
>
> Once you have those functions, myFun looks much better:
>
> myFun db myType = update_nextId (+1) $ update_tMyType1 f db
> where f= insert myType1
>
> But, generating the update_ functions is not programming; its
> just manual syntax generation. And, even if you have template haskell
> to do it,
>
> * it is annoying to have to find/write the TH code to implement
> * update_ is incredibly verbose
> * shortening it risks proliferation of psuedo-syntax:
> u_tMyType, u__tMyType, or utMyType?
> * it adds clutter to have to call the TH for each record type, and
> * it pollutes the name space/increases risk of name collision
>
> Rather than force the user to jump through these hoops, why not make
> the syntax flow naturally from the existing record update syntax? It
> makes sense to use \= for this task as it is the functional
> generalization of C or Java's += or *= . Then myFun would have the
> elegant and clear syntax:
>
> myFun db myType1 =db {tMyType1\=insert myType1, nextId\=(+1)}
>
> -Alex-
>
>
> ______________________________________________________________
> S. Alexander Jacobson tel:917-770-6565 http://alexjacobson.com
> _______________________________________________
> Haskell mailing list
> Haskell at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell
>
--
Hal Daume III | hdaume at isi.edu
"Arrest this man, he talks in maths." | www.isi.edu/~hdaume
More information about the Haskell
mailing list