Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Haskell
Wiki community
Recent changes
Random page
HaskellWiki
Search
Search
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
Cn/WxHaskell/Quick start
(section)
Page
Discussion
English
Read
Edit
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
View history
General
What links here
Related changes
Special pages
Page information
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
==== 类型 ==== 一个典型的 wxHaskell 程序需要 import <tt>Graphics.UI.WX</tt> 库。如果你需要访问底层的wxWidgets 功能,你应该 import 更底层的 <tt>Graphics.UI.WXCore</tt> 库。<tt>main</tt> 函数用 <tt>start</tt> 函数来启动 GUI。函数 <tt>start</tt> 负责用指定的参数初始化 GUI 框架,然后启动窗口事件循环,直到应用程序退出,或者顶级窗口关闭为止。GUI 自身由以下的函数来描述: <pre>frame  ::             [Prop (Frame ())] -> IO (Frame ()) button :: Window a -> [Prop (Button ())] -> IO (Button ()) text   :: Attr (Window a) String layout :: Attr (Frame a)  Layout (:=)   :: Attr w a -> a -> Prop w set    :: w -> [Prop w] -> IO () command:: Event (Control a) (IO ()) on     :: Event w a -> Attr w a widget :: Window a -> Layout</pre> 实际上,上面有些函数拥有更普遍的类型,你可以在 GHCi 中用 <tt>:t</tt> 命令来查看它们的类型。 类型 <tt>Frame ()</tt> 和 <tt>Button ()</tt> 表示图形对象。这些对象拥有一些''properties''。创建对象时我们可以提供一些 property,创建之后也可以用 <tt>set</tt> 函数来修改 property。框架的 property 是 <tt>Prop (Frame ())</tt> 类型的,按钮的 property 是<tt>Prop (Button ())</tt> 类型的。 Properties 是通过组合 ''attributes'' 和值得到的。上面的例子当中提到了两种 attributes,它们分别是 <tt>text</tt> 和 <tt>layout</tt>。attribute 的类型 <tt>Attr w a</tt> 应用在类型 <tt>w</tt> 和值 <tt>a</tt> 上。值可以通过 <tt>(:=)</tt> 运算符绑定给 attribute。你可以在 [http://wxhaskell.sourceforge.net/doc/Graphics-UI-WX-Attributes.html WX.Attributes] 模块和 [http://wxhaskell.sourceforge.net/doc/Graphics-UI-WX-Classes.html WX.Classes] 模块的 haddock 文档上了解更多信息。 稍微有点特殊的 attribute 是 ''事件(events)''。事件的类型是 <tt>Event w a</tt>,并且可以使用 <tt>on</tt> 函数转换成 attribute <tt>Attr w a</tt>。事件的值通常是一个 <tt>IO</tt> 动作,它会在事件发生时执行。查看 [http://hackage.haskell.org/packages/archive/wx/latest/doc/html/Graphics-UI-WX-Events.html WX.Events] 模块和更底层的 [http://hackage.haskell.org/packages/archive/wxcore/latest/doc/html/Graphics-UI-WXCore-Events.html WXCore.Events] 模块的 haddock 文档,可以了解更多有关事件的知识。 因为 wxHaskell 是一个面向对象的框架,因此我们也实现了继承。图形对象的类型有一个额外的参数用来标明类的继承关系。当类型的参数是一个 unit <tt>()</tt> 时,表示这是一个具体的类型;当类型的参数是一个类型变量 <tt>a</tt> 时,表示这是一个类型类,用这个类型类的任意一个实例填实就可以了。举例来说,函数 <tt>frame</tt> 和函数 <tt>button</tt> 都返回一个具体的类型(框架或者按钮),类型参数是 <tt>()</tt>。作为对比,<tt>text</tt> 这个 attribute 它需要的只是任意种类的一个窗口,不管是框架还是按钮都行,所以它用 <tt>Window a</tt> 作为它的类型参数。前面我们就演示了如何在框架和按钮上使用 <tt>text</tt> 这个 attribute。在 wxHaskell 中,这样之所以能够工作,是因为类型 <tt>Frame ()</tt> 实际上是类型 <tt>Window (CFrame ())</tt> 的同义词,因此可以当需要 <tt>Window a</tt> 时给出一个 <tt>Frame ()</tt>。同样,类型 <tt>Button ()</tt> 只是类型 <tt>Control (CButton ())</tt> 的同义词,而后者又是类型 <tt>Window (CControl (CButton ()))</tt> 的同义词。
Summary:
Please note that all contributions to HaskellWiki are considered to be released under simple permissive license (see
HaskellWiki:Copyrights
for details). If you don't want your writing to be edited mercilessly and redistributed at will, then don't submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.
DO NOT SUBMIT COPYRIGHTED WORK WITHOUT PERMISSION!
Cancel
Editing help
(opens in new window)
Toggle limited content width