[Haskell] Proposal: Allow "\=" for field update in record update
syntax
S. Alexander Jacobson
alex at alexjacobson.com
Fri Feb 18 11:41:24 EST 2005
On Fri, 18 Feb 2005, Keean Schupke wrote:
> 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) }
That doesn't help you so much if you want to update more than
one field at a time. I think the best case syntax in this spirit is
to define:
x // f = f x
infixl 6 //
$(a field val) => \rec -> rec {field = val}
$(u field fn) => \rec -> rec {field = fn (field rec)}
Which we would then be able to use like this:
fun rec = rec // $(u field1 fn) . $(a field2 val)
But, I'm not sure that is superior to having the user explicitly
derive u_ and a_ functions on the rectype which looks like this:
$(deriveUpdate RecType)
fun rec = rec // u_field1 fn . a_field2 val
Aside: Why doesn't TH allow infix? Haskell doesn't allow operators
that start with ':' so it would seem natural for TH to use those for
infix. Then we could have e.g. (:=) and (:\=) and end up with a
syntax that looks like this:
rec // field :\= fn . field2 := val
And that is BETTER than the Haskell syntax that I originally proposed.
Are TH infix operators on the agenda?
-Alex-
______________________________________________________________
S. Alexander Jacobson tel:917-770-6565 http://alexjacobson.com
> 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