[Agda] Record "Setters"?

Andreas Abel andreas.abel at ifi.lmu.de
Wed May 11 14:18:26 CEST 2011


On 5/10/11 1:58 PM, Liam O'Connor wrote:
>
> I can't use the labels trick (already tried that), because I'm doing a
> dependent record.
>
>  > Using the manual setter implementation as below, to prevent quadratic
> blowup you could structure the record into subrecords.
>
> What do you mean by that? I'm not opposed to writing setters if they'll
> be short.

Well, I did not complain that "my code size grows quadratically"... ;-)

-- Andreas

> On 10 May 2011 18:15, Andreas Abel <andreas.abel at ifi.lmu.de
> <mailto:andreas.abel at ifi.lmu.de>> wrote:
>
>     Hi Liam,
>
>     you can model non-dependent records, as those below, as functions
>     from labels, e.g.
>
>     data BlahLabels : Set where Foo Bar Baz : BlahLabels
>
>     BlahTypes : BlahLabels -> Set
>     BlahTypes Foo = FooT
>     BlahTypes Bar = BarT
>     BlahTypes Baz = BazT
>
>     -- the record type
>     Blah : Set
>     Blah = (l : BlahLabels) -> BlahTypes l
>
>     -- the constructor
>     blah : FooT -> BarT -> BazT -> Blah
>     blah foo bar baz Foo = foo
>     blah foo bar baz Bar = bar
>     blah foo bar baz Baz = baz
>
>     -- individual field update
>     set : Blah -> (l : BlahLabels) -> BlahTypes l -> Blah
>     set r Foo x Foo = x
>     set r Bar x Bar = x
>     set r Baz x Baz = x
>     set r _   x l   = r l
>
>     For dependent records, this does not work, since one would need very
>     dependent function types.
>
>     You could do something with the new meta-programming facility,
>     though. Nicolas Pouillard might be able to help you with that.
>
>
>     Finally, we could think about adding a native syntax for record
>     update as in Haskell.  One thing to keep in mind is that with
>     dependent records, one might not be able to update individual fields
>     without making the record ill-typed.  Simultaneous update would be
>     possible, of course.
>
>     Cheers,
>     Andreas
>
>
>     On 10.05.11 8:05 AM, Liam O'Connor wrote:
>
>         In Haskell, if I make a record:
>
>         data Foo = Foo { x :: Bar, y :: Baz }
>
>         Then I'm automatically able to "set" values on those records:
>
>         blerp = Foo { x = 12, y = 13 }
>
>         blarp = blerp { x = 13} -- y is also 13.
>
>         Does agda have equivalent functionality? Writing these setters
>         manually
>         means my code size grows quadratically in the amount of fields
>         in the
>         record, as I have to write:
>
>         record Blah : Set where
>             field
>                foo : FooT
>                bar : BarT
>                baz : BazT
>
>             setFoo : FooT -> Blah
>             setFoo x = record { foo = x ; bar = bar ; baz = baz }
>
>             setBar : BarT -> Blah
>             setBar x = record { foo = foo ; bar = x ; baz = baz }
>
>             setBaz : BazT -> Blah
>             setBaz x = record { foo = foo ; bar = bar ; baz = x }
>
>         Is there any better way to do this? Any ideas?
>
>         If there is no easy way to do this, how hard would it be to add such
>         functionality to Agda? All you'd have to do is (perhaps at option)
>         generate setX functions as I have above. I might even write the
>         patch if
>         Agda's code is easy enough for me to figure out (I have some
>         experience
>         with PLs work).

-- 
Andreas Abel  <><      Du bist der geliebte Mensch.

Theoretical Computer Science, University of Munich
Oettingenstr. 67, D-80538 Munich, GERMANY

andreas.abel at ifi.lmu.de
http://www2.tcs.ifi.lmu.de/~abel/


More information about the Agda mailing list