Haskell:wxHaskell中的网格

时间:2010-05-11 22:47:06

标签: 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 个答案:

答案 0 :(得分:4)

在wxHaskell中,控件具有可以读取或更改的附加属性。节[Prop(Grid())]可以理解为“任何网格类型的属性列表”。

这是wxHaskell处理这样一个事实的方式,它构建于的wxWidgets库是面向对象的。 Grid()实际上意味着“Grid派生的继承层次结构中的任何东西” - 即Grid,ScrolledWindow,Panel,Window,EvtHandler,wxObject(如果从http://wxhaskell.sourceforge.net/doc/Graphics-UI-WXCore-WxcClassTypes.html#204开始,你可以遵循这一点)

当您查看Control的文档(例如ListCtrl)时,您会发现它被报告为具有一组属性和实例。基本上,您可以使用适用于Grid的层次结构的那些。例如,Grid派生自ScrolledWindow,因此您可以使用:

  • 属性scrollRate
  • 有色类的属性,例如bgcolor,color

您可以按如下方式使用这些属性,例如

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 )))