how do I create a List (or whatever. Not a Tuple though) that accepts different instances of some typeclass? Specifically, I want to do something like the following:
[labelNew (Just "foo"), buttonNewWithLabel "bar"]
I don’t care for the syntax-sugar, I just want to pass a list of widgets to a function that will pass them to another function which accepts any widgets.
Right now, the purpose is only to get rid of the line-noise, like that
boxPackStart box content1 PackNatural 0
boxPackStart box content2 PackNatural 0
...
boxPackStart box content100 PackNatural 0
should be eg
box <- col PackNatural [content1, content2, ..., content100]
I found some pages mentioning some dynamic lists but stopped reading when it said "not typesafe"
For widgets specifically, you can use
toWidget :: WidgetClass o => o -> Widget
to safely upcast labels and buttons to widgets, as in:
do
label <- labelNew (Just "foo")
button <- buttonNewWithLabel "bar"
col PackNatural [toWidget label, toWidget button]
Other gtk2hs classes have similar casting functions; generally in that package collection, to*
is a safe upcast and castTo*
is an unsafe downcast.