Functional programming 如何使鼠标事件处理更容易?

Functional programming 如何使鼠标事件处理更容易?,functional-programming,imperative-programming,Functional Programming,Imperative Programming,有时我必须实现一个像定制拖放这样的功能。代码可能是这样的: bool mouse_down = false; Vec2 mouse_pos; void on_mouse_down() { mouse_down = true; mouse_pos = cursor_pos(); } void on_mouse_move() { if(mouse_down) { Vec2f c = cursor_pos(); Vec2f d = c - mouse_pos; //

有时我必须实现一个像定制拖放这样的功能。代码可能是这样的:

bool mouse_down = false;
Vec2 mouse_pos;
void on_mouse_down() {
  mouse_down = true;
  mouse_pos = cursor_pos();
}
void on_mouse_move() {
  if(mouse_down) {
    Vec2f c = cursor_pos();
    Vec2f d = c - mouse_pos;
    // dragging. make objects tracing the cursor.
    // ...
  }
}
void on_mouse_up() {
  mouse_down = false;
  // dropped
  // ...
}

我知道这样做很好,但我根本不喜欢这种冗余变量和分离过程。在IP(命令式编程)中,这可能是不可避免的;我的问题是,在FP(函数式编程)中有没有更好的方法来处理这类事情?任何想法和建议,无论是编程语言、Lisp、Scheme、F#、Ruby等,还是在IP中实现这一点的更好方法,我们都将不胜感激。

既然一天内没有人尝试回答,我将试一试。我理解您正在讨论的问题,但答案可能取决于操作系统、语言及其运行库

一般的想法是,当鼠标按下时,会产生一个异步计算。这种计算会“阻塞”事件,并在其自身的循环中处理它们(如已获取),执行您需要执行的操作;当鼠标按钮按下时,它就存在了。虽然这看起来像一个命令线程,但实际上,当计算被“阻止”时,它只会将控制权让给它的起始位置(可能是调用鼠标按下事件的主GUI线程)。通过这种方式,状态被封装到一个词汇上的局部计算范围中。这种魔力必须由语言的运行时来处理,因此这是我们用语言和操作系统不可知的方式得到的答案

关于这种实现的一个例子,check和an都在讨论您的问题,但都是在Windows、.NET和F#的狭隘环境中进行的。同样的佩蒂切克有一本书,书中同样的思想用C#表达,令人惊讶,C#通常不被视为函数式语言。第十六章,如果我还记得的话,是你的


至于在IP/OO语言程序中封装状态,您可以在鼠标按下处理程序中创建类的实例。该实例将在运行时注册自身,以接收其他鼠标和UI事件,处理它们,完成所有工作,并在需要时(鼠标启动或窗口系统取消捕获模式),取消注册并销毁自身。虽然没有函数式语言所允许的那么优雅,但仍然比在通用UI类中保持可变状态要好得多。

既然一天内没有人试图回答这个问题,我就试一试。我理解您正在讨论的问题,但答案可能取决于操作系统、语言及其运行库

一般的想法是,当鼠标按下时,会产生一个异步计算。这种计算会“阻塞”事件,并在其自身的循环中处理它们(如已获取),执行您需要执行的操作;当鼠标按钮按下时,它就存在了。虽然这看起来像一个命令线程,但实际上,当计算被“阻止”时,它只会将控制权让给它的起始位置(可能是调用鼠标按下事件的主GUI线程)。通过这种方式,状态被封装到一个词汇上的局部计算范围中。这种魔力必须由语言的运行时来处理,因此这是我们用语言和操作系统不可知的方式得到的答案

关于这种实现的一个例子,check和an都在讨论您的问题,但都是在Windows、.NET和F#的狭隘环境中进行的。同样的佩蒂切克有一本书,书中同样的思想用C#表达,令人惊讶,C#通常不被视为函数式语言。第十六章,如果我还记得的话,是你的


至于在IP/OO语言程序中封装状态,您可以在鼠标按下处理程序中创建类的实例。该实例将在运行时注册自身,以接收其他鼠标和UI事件,处理它们,完成所有工作,并在需要时(鼠标启动或窗口系统取消捕获模式),取消注册并销毁自身。没有函数式语言所允许的那么优雅,但比在通用UI类中保持可变状态要好得多。

上面的代码只是一个最简单的示例。如果我在整个系统中添加更多的函数和限制,比如左、右、中、轮、双击、光标在不同对象上移动时的不同操作,变量帐户将会爆炸……上面的代码只是一个最简单的示例。如果我在整个系统中添加更多的功能和限制,比如左、右、中、轮、双击、光标在不同对象上移动时的不同操作,变量帐户将会爆炸。。。