我目前正在按照书中的练习:"哈斯克尔表达学派",并已进入创建图形的第三章。本书使用SOEGraphics模块,演示如何在窗口中绘制一些简单的文本,然后按一下按钮将其关闭。
但是,在编译和执行后,我发现尽管窗口在屏幕上显示文本,但无论我按哪个键或焦点是在命令行上还是窗口本身,窗口都拒绝关闭。
以下是本书的源代码:
module Main where
import SOE
main = runGraphics(
do w <- openWindow
"My First Graphics Program" (300, 300)
drawInWindow w (text(100,200) "HelloGraphicsWorld")
k <- getKey w
closeWindow w
)
关闭窗口的唯一方法是使用 CTRL-C 强制窗口退出。我的代码是否忽略了什么?该程序使用GHC 7.4.1编译,并在Ubuntu上运行。
尝试getKeyChar
getKey
.在某些操作系统中使用和/或行为的首选方法似乎发生了变化。
我使用的是 SOE 软件包的当前版本,该软件包是在问题日期前大约 9 个月发布的。就像问题的海报一样,我在 Ubuntu (12.04) 上运行 GHCi 7.4.1。我遇到了同样的问题,但DuckMaestro的答案不适用:
getKeyChar
未在 SOE 包中的任何模块中定义。但是,getKeyEx
是:
getKeyEx :: Window -> Bool -> IO Char
尽管 SOE 包本身中未记录,但此函数似乎在 Graphics.HGL.Utils
模块中模拟了其同名函数。
但是,getKey
是从 SOE 模块导出的,getKeyEx
不是。
为了编译并在按键事件上关闭窗口
- 从 SOE 模块导出
getKeyEx
- 在问题中引用的代码中,
k <- getKey w
更改为k <- getKeyEx w True
丹尼尔是正确的,但我发现getKeyEx工作而仅使用getKeyEx的getKey却不工作很奇怪。 于是我看了看。 问题很明显。 这是getKey的现有代码
getKey win = do
ch <- getKeyEx win True
if ch == 'x0' then return ch
else getKeyEx win False
这是它应该是什么
getKey win = do
ch <- getKeyEx win True
if ch /= 'x0' then return ch
else getKeyEx win False
进行此修复并获取密钥工作。