
Hi all, it seems that there are a lot of issues left open about the following basic concepts: - The usage of (:=) and existential types instead of (=:) for turning attributes into something which can go into an argument list. Pro for := : It reflects the semantics of assigning something to an attribute. Contra for := : it might be a keyword in future Haskell, it requires non-Haskell 98 features. - The necessity of read only attributes. - The necessity of write only attributes. Or getting rid of them in favour of mandatory arguments (to the constructor). - Callbacks get separate functions which called on<WidgetName><ActionName> I would like propose the following basic setup, together with the questions how read only attribute can fit in. Write only attributes could be easily added by just supplying "pushButtonNow :: Setter Button", albeit breaking the := syntax - you'd have to say set b ["Hello" =: label, pushButtonNow] Here it is: -- An attribute is a property of a widget. It knows how to set the -- and how to read the value of this property. data WidgetClass w => Attr a w = <abstract> -- The assignment operator joins an attribute with its value. (=:) :: a -> Attr a w -> Setter w -- Set and get can be used on every widget. set :: WidgetClass w => w -> [Setter w] -> IO () get :: WidgetClass w => w -> Attr a w -> IO a -- An example for a Button widget: The constructor has one -- mandatory argument. newButton :: Container -> [Setter Button] -> IO Button -- The Button has at least this attribute. label :: Attr String Button -- This is one callback the Button provides. Note that you cannot -- attach any function at construction time or with the set -- function. The returned action is the unregister function. onClicked :: ButtonClass b => b -> IO () -> IO (IO ()) Axel.