[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