> 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

Reply via email to