Как сделать условно на NCurses getEvent - PullRequest
3 голосов
/ 07 апреля 2019

Я смотрю информацию здесь: 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 ]

1 голос
/ 07 апреля 2019

Вы правильно определили проблему.Ваше предлагаемое решение, чтобы поставить Key слева от равных, состоит в том, чтобы утверждать , что у вас есть ключ, когда вы уже определили, что на самом деле его нет!

Просмотр ссылки на пакет показывает, что Event может быть нажатием клавиши EventSpecialKey Key.Таким образом,

setX e = case e of --lambdacase would be even more idiomatic
    Just (EventSpecialKey KeyLeftArrow) -> -1
    Just (EventSpecialKey KeyRightArrow) -> 1
    _ -> 0
0 голосов
/ 07 апреля 2019

Глядя на 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
...