如何在NCurses getEvent

时间:2019-04-07 14:38:58

标签: haskell ncurses

我正在从这里查看信息: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上获得工作条件?

2 个答案:

答案 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

我们去阅读文档,以了解有关EventKey类型的更多信息。 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