[Haskell] Proposal: Allow "\=" for field update in record update
syntax
Keean Schupke
k.schupke at imperial.ac.uk
Fri Feb 18 13:20:25 EST 2005
Yes, your idea is much nicer... I was just suggesting TH as a way to
implement custom syntax... It would be nice if come sort of standard
existed for template-haskell so that other compilers/interpreters could
adopt it. A portable template would be a cool thing.
Keean.
S. Alexander Jacobson wrote:
> 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