> I often create structures like:
> data MyData = MyData { foo :: ..., bar :: ..., .... }
That makes 2 of us :-)
> and most of the time i do one of two things:
> 1) read values from the structure, as in:
> let x = (foo myData) in ...
> 2) update values in the structure, as in:
> let myData' = myData { foo = (foo myData)+1 }
1)
I've used datatypes with labeled fields mostly to pass around implicit values.
If that is your case then there is a way around it.
Declare the datatype as
> data MyData = MyData { foo_ :: fooType, bar_ :: ..., .... }
and then declare
> foo :: (?implicitdata :: MyData)=> fooType
> foo = foo_ ?yourdata
So when you work in a contex that depends on some implicit data you can just
use foo. I've used this *a lot* lately.
2)
Yes. My method now is declaring set and apply functions to every field of my
data structure.
fooAp f ni=ni{foo=f(foo ni)}
fooSet x = fooAp (const x)
> Only very rarely (usually only during intializization) do I actually put
> values into the structure that *don't* depend on their previous value. I
> end up with expresions like:
>
> ... myData { foo = (foo myData) + 1 ;
> bar = (bar myData) ++ "bar" ;
> ick = (ick myData) ! n ; ... }
Yeap quite ugly isn't it? :-)
> I was wondering if there existed any sort of "update" syntax. Obviously
Nope, not that I know of.
> not real update, but enough to get rid of the "(foo myData)" parts of my
> epxression which really serve to just clutter up with expression. Perhaps
> something like:
>
> ... myData { foo <- (+1) ; bar <- (++"bar") ; ick <- (!n) ; ... }
Yes looks nice, thought about something like that before too.
> or the like, where "x { ... y <- e ... } is translated to "x { ... y = e
> (y x) ... }" (i only use "<-" because that seems to be the default
> extension symbol, i guess because we don't want to trample symbols people
> might actually use.)
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 ;)
J.A.
_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell