2017-01-04 46 views
0

如何創建一個列表(或任何不是一個元組雖然)接受某些類型類的不同實例? 具體來說,我想要做的東西像下面這樣:gtk2hs小部件列表

[labelNew (Just "foo"), buttonNewWithLabel "bar"] 

我不喜歡的語法糖,我只是想小部件列表傳遞給一個函數,將它們傳遞給另一個函數接受任何小部件。

眼下,目的僅僅是擺脫了線的噪聲,這樣的

boxPackStart box content1 PackNatural 0 
boxPackStart box content2 PackNatural 0 
... 
boxPackStart box content100 PackNatural 0 

應該例如

box <- col PackNatural [content1, content2, ..., content100] 

我發現一些網頁提一些動態列表,但不讀當它說「不安全」時

+0

僅僅使用['Widget's]的普通列表有什麼問題(http://hackage.haskell.org/package/gtk3-0.14.6/docs/Graphics-UI-Gtk-Abstract-Widget。 HTML#T:小工具)? – leftaroundabout

+0

類似於以下內容? 'map(\ c - > boxPackStart box c PackNatural 0)[content1,content2,content3]' – mb21

回答

1

對於小部件具體而言,您可以使用

toWidget :: WidgetClass o => o -> Widget 

安全上溯造型標籤和按鈕控件,如:

do 
    label <- labelNew (Just "foo") 
    button <- buttonNewWithLabel "bar" 
    col PackNatural [toWidget label, toWidget button] 

其他gtk2hs類也有類似的轉換函數;一般在那個包收集中,to*是一個安全的upcast,castTo*是一個不安全的downcast。