假设我在Scala中编写一个简单的GUI练习:窗口中有一个形状(例如圆形或方形),用户可以用鼠标拖动它。
我可以使用状态模式在Java中编写它(请参阅下面的详细信息):
...
应用程序有两种状态:没有任何反应时IDLE和用户拖动形状时DRAGGING。它始于IDLE。
两个州处理3个鼠标事件:
IDLE按如下方式处理鼠标事件:
DRAGGING按如下方式处理它们:
...
现在我想知道如何在功能方式中在Scala中实现它 这种计算本质上是有状态的。你会建议使用 State monad 吗?
答案 0 :(得分:3)
即使使用简单的尾递归也可以处理,但这里的问题是“事件”。这通常意味着控制倒置。如果你控制listen循环,那么你可以使用递归或状态monad。如果你不这样做,那么你最好的是Functional Reactive Programming (FRP)。
Scala中至少有两个FRP框架。一个是EPFL,我不知道它与生产水平有多接近,也不知道确切的名称(尽管我认为它是反应性的),另一个叫做Reactive,它已经相当成熟了。此外,它的作者在Stack Overflow上查看Scala问题,因此您可以在这里获得帮助。