我正在从这里查看信息:Hackage
我希望我的程序中发生不同的事情,具体取决于所按下的箭头键。使用NCurses模块,我可以使用getEvent函数注册一个事件。但是我无法让我的if语句对存储的事件起作用。这是我的代码:
main = runCurses $ do
w <- defaultWindow
e <- getEvent w (Just 300)
let x = setX e
setX e
| e == KeyLeftArrow = -1
| e == KeyRightArrow = 1
| otherwise = 0
这得到Couldn't match expected type ‘Key’ with actual type ‘Maybe Event’
,所以我更改为e == Just Key...Arrow
然后得到
Couldn't match type ‘Event’ with ‘Key’
Expected type: Maybe Key
Actual type: Maybe Event
我猜这是因为e
是一个事件,我的行为好像它是一个键,但是即使尝试了这个Key e == Just Key...Arrow
也无法正常工作。如何将这个事件变成钥匙?还是可以通过其他方式使我在e
上获得工作条件?
答案 0 :(得分:1)
您已正确识别问题。建议的解决方案是将Key
放在等号的左侧,是断言,当您已经确定实际上没有密钥时,您才拥有密钥!
查看包链接,发现Event
可能是按键EventSpecialKey Key
。因此,
setX e = case e of --lambdacase would be even more idiomatic
Just (EventSpecialKey KeyLeftArrow) -> -1
Just (EventSpecialKey KeyRightArrow) -> 1
_ -> 0
答案 1 :(得分:0)
查看getEvent
的定义
getEvent
:: Window
-> Maybe Integer
-> Curses (Maybe Event)
您可能会注意到,它返回Maybe Event
包装成Curses
单子的形式。在setX
函数中,您尝试将事件与键进行比较。
编译器确切地说出了这种不匹配的情况:
Couldn't match type ‘Event’ with ‘Key’
Expected type: Maybe Key
Actual type: Maybe Event
我们去阅读文档,以了解有关Event
和Key
类型的更多信息。
Event
的定义方式如下:
data Event
= EventCharacter Char
| EventSpecialKey Key
| EventMouse Integer MouseState
| EventResized
| EventUnknown Integer
您可能会注意到Event
有几个变体(构造函数),其中一个EventSpecialKey
包装了Key
。这正是您所需要的。
setX e
| e == Just (EventSpecialKey KeyLeftArrow) = -1
| e == Just (EventSpecialKey KeyRightArrow) = 1
| otherwise = 0