Почему сигнатура типа getEvent такая? - PullRequest
0 голосов
/ 30 января 2019

Сигнатура типа для getEvent из библиотеки UI.NCurses имеет сигнатуру типа

Window -> Maybe Integer -> Curses (Maybe Event)

Однако, используя эту функцию кучу, я все еще не совсем уверен, чтоWindow используется для.В документации сказано, что это

Получение [s] следующего события из заданного окна.

Но это на самом деле меня не очень просветляет (и чтение источникакод также не поразительный для меня).Мне кажется, что если происходит событие, такое как нажатие клавиши, оно не происходит в окне.И эксперименты подтверждают эту гипотезу, я, кажется, улавливаю те же события независимо от того, через какое окно я прохожу.Если у меня открыто несколько окон, какая разница, если я передаю одно или другое?

И если оно действительно использует окно, почему сигнатура типа не является более естественной

Maybe Integer -> Update (Maybe Event)

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Для функции getEvent необходимо окно

Библиотека Haskell NCurses написана поверх библиотеки GNU ncurses, библиотеки C.Поскольку библиотека GNU ncurses имеет отдельные входные очереди для каждого окна, функция getEvent должна знать, из какого окна получать входные данные, когда она вызывает соответствующие подпрограммы GNU ncurses.Потребность в окнах для отдельных входных очередей, вероятно, более очевидна, когда ввод не обрабатывается сразу после его получения.

Update монада против Window аргумент?Произвольный

Пакет UI.NCurses содержит неэкспортированную функцию

withWindow :: (Window -> IO a) -> Update a

, которую, как предполагает ее тип, можно использовать для простого преобразования функции, которая принимает Window в качестве входных данных для однойкоторый возвращает свой результат, заключенный в монаду Update.Кажется, что люди, которые разработали библиотеку Haskell NCurses, просто думали, что getEvent будет работать лучше в большинстве случаев, принимая Window в качестве аргумента вместо использования Update монады.

0 голосов
/ 30 января 2019

В общем, Haskell хочет, чтобы все "зависимости" функции передавались как аргументы.В теле getEvent он несколько раз использует переданный аргумент win.

Аналогия OO будет window.getEvent(timeout).Однако в FP, кроме порядка расположения параметров в функции, нет ничего особенного в первом аргументе.

Что касается того, что произойдет, если вы передадите другое окно, в документах говорится:

Получить следующее 'Событие' из заданного окна.

Итак, предположительно, вы получаете события, ограниченные определенным окном, которое было передано в качестве аргумента.Для дальнейшей аналогии с ОО, есть разница между:

myMainWindow.getEvent(100)
popupWindow.getEvent(250)

То есть разными экземплярами из window.

...