2010-05-11 21 views
0

有人能解釋我這個代碼一行一行嗎?Haskell:wxHaskell中的網格

如何與宣言緊密聯繫? 這是什麼意思:[Prop(Grid())]?

感謝幫助

gridCtrl :: Window a -> [Prop (Grid())] -> IO (Grid()) 
gridCtrl parent props 
    = feed2 props 0 $ 
    initialWindow $ \id rect -> \props flags -> 
    do g <- gridCreate parent id rect flags 
     gridCreateGrid g 0 0 0 
     set g props 
     return g 
+0

請閱讀[Markdown formatting reference](http://stackoverflow.com/editing-help)並重新格式化您的代碼,以使其更具可讀性。 – 2010-05-11 23:14:33

回答

4

在wxHaskell,控制已附着可讀取或改變性質。節[Prop(Grid())]可以理解爲「任何Grid類型的屬性列表」。

這是wxHaskell處理wxWidgets庫的方法,它是構建在面向對象的基礎上的。網格()實際上是指「在繼承層次從電網派生什麼」 - 即電網,ScrolledWindow,面板,窗口,EvtHandler,wxObject(您可以通過,如果你在http://wxhaskell.sourceforge.net/doc/Graphics-UI-WXCore-WxcClassTypes.html#204開始在遵循本)

當你看控件的文檔(例如ListCtrl)會發現它被報告爲具有一組屬性和實例。基本上,您可以使用那些適用於Grid的層次結構。例如,電網從ScrolledWindow派生,所以你可以使用:

  • 屬性scrollRate有色類如的
  • 屬性BGCOLOR,顏色

使用這些屬性,如下所示,例如由線

g <- gridCtrl parent [color := red, bgcolor := green, scrollRate := 41] 
... 
set g [color := blue] 

線,代碼讀取類似如下:

  • 使用所提供的性能(道具
  • initialWindow(其將在窗口填id和初始rect標記),調用floowing包裝爲了功能:
  • gridCreate創建一個新的網格實例
  • 使用新的網格實例,設置網格內有0行,0列並沒有什麼選擇。
  • 應用由調用者提供的屬性(道具)到電網(例如放數據中,設置樣式等)

這使得代碼最難讀取的部分是feed2功能,並且代碼以'$'風格寫入以向feed2提供正確的參數。上面我稍稍揮手的解釋應該是足夠了,但如果你想了解詳細信息,瞭解到feed2只是由反轉功能應用

feed2 x y f = f x y 

然後用括號替換「$」的應用程序。這看起來不可愛,但更易於閱讀。

gridCtrl parent props = 
    feed2 props 0 
    (initialWindow (\id rect -> 
         \props flags -> 
         do 
         g <- gridCreate parent id rect flags 
         gridCreateGrid g 0 0 0 
         set g props 
         return g)))