[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