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 )))
Другие вопросы по тегам