为什么 getEvent 的类型签名是什么?

Why is the type signature of getEvent what it is?

UI.NCurses 库中 getEvent 的类型签名具有类型签名

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

然而,这个函数用了很多次后,我仍然不太清楚 Window 的用途。文档说它

Get[s] the next Event from a given window.

但这并没有真正启发我很多(阅读源代码对我来说同样没有启发)。在我看来,如果像按键这样的事件发生,它不会在 window 内发生。实验支持这个假设,无论我通过什么 window,我似乎都选择了相同的事件。如果我有几个 windows 打开,如果我通过一个或另一个有什么区别?

如果它确实使用 window 为什么类型签名不是更自然

Maybe Integer -> Update (Maybe Event)

一般来说,Haskell 希望函数的所有 "dependencies" 都作为参数传入。在 getEvent 的正文中,它多次使用传入的 win 参数。

面向对象的类比是 window.getEvent(timeout)。但是在 FP 中,除了函数参数的顺序之外,第一个参数没有什么特别的。

至于如果你传递一个不同的 window 会发生什么,文档说:

Get the next 'Event' from a given window.

因此,大概您正在获取作为参数传递的特定 window 范围内的事件。进一步类比OO,就是两者的区别:

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

也就是说,window的不同实例

getEvent函数需要一个window

Haskell NCurses 库是在 GNU ncurses 库(一个 C 库)之上编写的。 由于 GNU ncurses 库对每个 window 都有单独的输入队列,getEvent 函数在调用适当的 GNU ncurses 例程时需要知道从哪个 window 获取输入。 windows 需要有单独的输入队列时,当输入没有在收到后立即处理时可能更明显。

Update monad 与 Window 参数?任意

UI.NCurses 包包含一个未导出的函数

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

正如它的类型所暗示的那样,可以用来轻松地将一个以 Window 作为输入的函数转换为 returns 其结果包含在 Update monad 中的函数。 似乎开发 Haskell NCurses 库的人只是认为 getEvent 在大多数情况下使用 Window 作为参数而不是使用 Update monad 会更好。