[Haskell] Proposal: Allow "\=" for field update in record update
syntax
Keean Schupke
k.schupke at imperial.ac.uk
Fri Feb 18 04:16:46 EST 2005
Its a pity template haskell cannot define infix operators, but you could
use TH like:
$update rec field fn
which would expand to:
rec { field = fn (rec field) }
Keean.
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
More information about the Haskell
mailing list