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
1 ответ
В wxHaskell к элементам управления прикреплены свойства, которые можно прочитать или изменить. Раздел [Prop (Grid ())] можно понимать как "список свойств для любого типа Grid".
Это способ wxHaskell справиться с тем фактом, что библиотека wxWidgets, на которой она построена, является объектно-ориентированной. Grid () на самом деле означает "что-либо в иерархии наследования, из которого происходит Grid" - то есть Grid, ScrolledWindow, Panel, Window, EvtHandler, wxObject (вы можете выполнить это, если начнете с http://wxhaskell.sourceforge.net/doc/Graphics-UI-WXCore-WxcClassTypes.html)
Когда вы посмотрите на документацию по элементу управления (например, ListCtrl), вы обнаружите, что он имеет набор атрибутов и экземпляров. По сути, вы можете использовать те, которые относятся к иерархии для Grid. Например, Grid наследуется от ScrolledWindow, поэтому вы можете использовать:
- Атрибут scrollRate
- Атрибуты класса Colored, например, bgcolor, color
- и т.п.
Вы используете эти свойства следующим образом, например,
g <- gridCtrl parent [color := red, bgcolor := green, scrollRate := 41]
...
set g [color := blue]
Строка за строкой код выглядит примерно так:
- Использование предоставленных свойств (реквизит)
- и initialWindow (которое будет заполнять идентификатор окна, а также начальные прямоугольник и флаги), будет вызывать упакованные функции в следующем порядке:
- gridCreate для создания нового экземпляра Grid
- Используя новый экземпляр сетки, установите сетку внутри с 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 )))