[Template-haskell] Re: [Haskell] Proposal: Allow "\=" for field update in record update syntax

Keean Schupke k.schupke at imperial.ac.uk
Tue Mar 8 05:40:50 EST 2005


Simon Peyton-Jones wrote:

>To have what you want takes a syntactic extension to Haskell; TH
>requires '$' to indicate splices.  You'd have to write something like
>
>	$( [| name |] =:= val )
>
>instead of
>
>	name := val
>
>where (=:=) :: ExpQ -> a -> ExpQ
>
>You can do that today, but I guess you won't find it as convenient.
>
>It's very hard to know where to stop when adding syntax; and the record
>design space is particularly complicated (there have been many
>proposals, all with different relative merits).   And defining new
>syntax often makes some existing programs stop working; in this case,
>ones that use ":=" as a data constructor.
>
>Simon
>  
>
Surely thats an argument for template-haskell to support adding some syntax,
as everyone can define their own record short-hand... or in fact a 
consensus can
develop through a standard library.

Can you use splices an infix position?

    name $=:= val
    name $`eq` val
    name `$eq` val

Are any of the above a possibility?

    Keean.

>| -----Original Message-----
>| From: S. Alexander Jacobson [mailto:alex at alexjacobson.com]
>| Sent: 07 March 2005 16:46
>| To: Simon Peyton-Jones
>| Cc: template-haskell at haskell.org; Sander Evers
>| Subject: RE: [Template-haskell] Re: [Haskell] Proposal: Allow "\=" for
>field update in record update
>| syntax
>| 
>| Most generally, I use records all over the place in my code (is this
>| bad style?), and the current syntax for record update is really
>| unwieldy.
>| 
>| I'd like some way to have operators like (:=) and (:\=) for record
>| update.  I don't yet know TemplateHaskell so I don't know how you
>| define functions in it, but I would like some way to write:
>| 
>|    name := val = \rec-> rec { name = val}
>|    name :\= fn = \rec -> rec { name = fn $ name rec}
>| 
>| And I would like to be able to use these operators as Sander Evers
>| showed:
>| 
>|    data Country = Country {capital :: City, ...}
>|    data City = City {inhabitants :: Int, ...}
>| 
>|    birth_in_capital :: Country -> Country
>|    birth_in_capital = capital :\= (inhabitants :\= (+1))
>| 
>| It would be even nicer if we could define the precedence of these
>| operators so that we could write the above
>| 
>|    birth_in_capital = capital :\= inhabitants :\= (+1)
>| 
>| Though since haskell is usually prefix, perhaps it would be best to be
>| able to write it:
>| 
>|    birth_in_capital = (+1) :\= inhabitants :\= capital
>| 
>| Note: It is entirely possible that this is a Haskell rather than a
>| template haskell issue.  I don't know the border between the projects.
>| 
>| -Alex-
>| 
>| ______________________________________________________________
>| S. Alexander Jacobson tel:917-770-6565 http://alexjacobson.com
>| 
>| 
>| 
>| On Mon, 7 Mar 2005, Simon Peyton-Jones wrote:
>| 
>| > What exactly is it that TH doesn't support, that you want?
>| >
>| > Simon
>| >
>| > | -----Original Message-----
>| > | From: template-haskell-bounces at haskell.org
>| > [mailto:template-haskell-bounces at haskell.org] On
>| > | Behalf Of S. Alexander Jacobson
>| > | Sent: 28 February 2005 10:32
>| > | To: Sander Evers; template-haskell at haskell.org
>| > | Subject: [Template-haskell] Re: [Haskell] Proposal: Allow "\=" for
>| > field update in record update syntax
>| > |
>| > | Since operators can't start with a ':', is there an in-principle
>| > | reason TH does not support : operators?  The syntax below would be
>| > | really nice to have.
>| > |
>| > |
>| > |
>| > | On Fri, 18 Feb 2005, Sander Evers wrote:
>| > |
>| > | >
>| > | >> 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.
>| > | >
>| > | > This syntax is also nice for composition of update functions,
>which
>| > is useful
>| > | > with nested records:
>| > | >
>| > | > data Country = Country {capital :: City, ...}
>| > | > data City = City {inhabitants :: Int, ...}
>| > | >
>| > | > birth_in_capital :: Country -> Country
>| > | > birth_in_capital = capital :\= (inhabitants :\= (+1))
>| > | >
>| > | > This also shows that it would be useful to make :\= associate to
>the
>| > right.
>| > | >
>| > |
>| > | ______________________________________________________________
>| > | S. Alexander Jacobson tel:917-770-6565 http://alexjacobson.com
>| > | _______________________________________________
>| > | template-haskell mailing list
>| > | template-haskell at haskell.org
>| > | http://www.haskell.org/mailman/listinfo/template-haskell
>| >
>
>_______________________________________________
>template-haskell mailing list
>template-haskell at haskell.org
>http://www.haskell.org/mailman/listinfo/template-haskell
>  
>



More information about the template-haskell mailing list