Re: updating labelled fields
Hello.
DrIFT which i am now maintaining can derive such utility functions out of the box. just add a {-!deriving: update -} to get update functions for every labeled field in a datatype. quite useful, I have not updated the web page yet, but the new DrIFT homepage will be at
Nothing against DrIFT, but it requieres running preprocessing before real compilation; I don't like it for short programs, that I have defined just in one module and I'm debugging/modificating them. I've thought about syntax for set/update functions some time ago too. What I though about is: ({assignments}) desugars to \x->x{assignments} x{as, field =, bs} desugars to \y->x{as, field = y, bs} x{as, field, bs} desugars to \f->x{as, field = f (field x), bs} Then set function would be just ({field =}) and apply ({field}) (it does not need to create some artificial names for them that could colide with user names). Not really sure it does not conflict with rest of syntax, though. Zdenek Dvorak
Anyway I'd prefer to have some way to 'derive' apply and set functions. Something like
data MyData = MyData { foo :: fooType, bar :: ..., .... } deriving (Set, Apply)
Using the keyword "deriving" would probably be a bad idea though :) The set and apply functions could be derived with a standard postfix or maybe prefix... fooAp or apFoo. Maybe we could introduce sintax to specify it...
deriving (Set with "set", Apply with "ap")
I don't know... I'm just brainstorming right now. Having actual functions is important. I don't think I have to explain why to people in this mailing list :-)
Anyway, does such a thing exist, and, if not, is there any chance it could exist, or is it just syntactic salt to too many people? :) I whish you better luck than I've had so far whenever making posts about this same issue ;)
_________________________________________________________________ MSN Photos is the easiest way to share and print your photos: http://photos.msn.com/support/worldwide.aspx
I like this idea, but I think it will cause ambiguity in parsing. Consider: blah = do {foo} ... should foo be parsed as a statement list (under the assumption that the open brace is instead of using layout) or as an assignment, as in: blah = do {foo} x <- bar (which probably wouldn't typecheck, but we don't know that at parsing.) i could be wrong and it might be able to be made work, but i'm not convinced... Another option that I believe would work, drawing from the deriving (Set with "set") thing posted earlier, that I think may be better in the sense that it doesn't confusing set/apply function naming with class derivations, would be something like: data T = T { myString :: String with (Set as setMyString, Apply as apMyString), myInt :: Int with (Set as setMyInt), myBool :: Bool with (Apply as apMyBool) } which would be the equivalent of defining "data T = T {myString::String, myInt::Int,myBool::Bool}" and four functions: setMyString, apMyString, setMyInt and apMyBool. This allows you to specify exactly which functions you want. Perhaps even allow something like: data T = T { myString :: String with (Set,Apply), myInt :: Int with (Set), myBool :: Bool with (Apply) } where the "default" names are used (i.e., Set for x is "set" + x with the first letter capitalized). This brings up one issue, namely, what to do with: data T = T { a :: String with (Set), b :: Int } | U { a :: String with (Set,Apply), c :: Bool } Personally, I don't think this should be disallowed and the definitions should be: setA b (T a _) = T a b setA b (U a _) = U a b apA f (U a b) = U a (f b) How do people feel about something like this? I've already implemented the $= apply in my personal copy of ghc and it works fine (as witnessed by -ddump-parsed); i think it required about 8 lines of code to be changed. - Hal -- Hal Daume III "Computer science is no more about computers | hdaume@isi.edu than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume On Tue, 7 May 2002, Zdenek Dvorak wrote:
Hello.
DrIFT which i am now maintaining can derive such utility functions out of the box. just add a {-!deriving: update -} to get update functions for every labeled field in a datatype. quite useful, I have not updated the web page yet, but the new DrIFT homepage will be at
Nothing against DrIFT, but it requieres running preprocessing before real compilation; I don't like it for short programs, that I have defined just in one module and I'm debugging/modificating them.
I've thought about syntax for set/update functions some time ago too. What I though about is:
({assignments}) desugars to \x->x{assignments} x{as, field =, bs} desugars to \y->x{as, field = y, bs} x{as, field, bs} desugars to \f->x{as, field = f (field x), bs}
Then set function would be just ({field =}) and apply ({field}) (it does not need to create some artificial names for them that could colide with user names).
Not really sure it does not conflict with rest of syntax, though.
Zdenek Dvorak
Anyway I'd prefer to have some way to 'derive' apply and set functions. Something like
data MyData = MyData { foo :: fooType, bar :: ..., .... } deriving (Set, Apply)
Using the keyword "deriving" would probably be a bad idea though :) The set and apply functions could be derived with a standard postfix or maybe prefix... fooAp or apFoo. Maybe we could introduce sintax to specify it...
deriving (Set with "set", Apply with "ap")
I don't know... I'm just brainstorming right now. Having actual functions is important. I don't think I have to explain why to people in this mailing list :-)
Anyway, does such a thing exist, and, if not, is there any chance it could exist, or is it just syntactic salt to too many people? :) I whish you better luck than I've had so far whenever making posts about this same issue ;)
_________________________________________________________________ MSN Photos is the easiest way to share and print your photos: http://photos.msn.com/support/worldwide.aspx
_______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell
Hello, I am not sure if this is what is needed, but you can do the following in Hugs (with extensions): data T = T { x :: Int , y :: Char } f s@T {x} = s { x = x + 1 } This increments the first field in the record, and leavs the second one unchanged. It makes use of punning, a very useful feature I think, which unfortunately was removed from Haskell, I am not sure why. It is still supported in Hugs however. bye Iavor
participants (3)
-
Hal Daume III -
Iavor S. Diatchki -
Zdenek Dvorak