如何以功能方式进行Scala练习?

时间:2014-02-08 18:10:12

标签: scala user-interface functional-programming state monads

假设我在Scala中编写一个简单的GUI练习:窗口中有一个形状(例如圆形或方形),用户可以用鼠标拖动它。

我可以使用状态模式在Java中编写它(请参阅下面的详细信息):

...

应用程序有两种状态:没有任何反应时IDLE和用户拖动形状时DRAGGING。它始于IDLE。

两个州处理3个鼠标事件:

  • 鼠标按下
  • 鼠标已发布
  • 鼠标移动

IDLE按如下方式处理鼠标事件:

    如果鼠标位置在形状内部移动到DRAGGING状态,
  • 鼠标按下
  • on 鼠标已发布鼠标移动无效

DRAGGING按如下方式处理它们:

  • on mouse release 移至IDLE状态
  • on 鼠标释放什么都不做
  • on 鼠标移动移动形状

...

现在我想知道如何在功能方式中在Scala中实现它 这种计算本质上是有状态的。你会建议使用 State monad 吗?

1 个答案:

答案 0 :(得分:3)

即使使用简单的尾递归也可以处理,但这里的问题是“事件”。这通常意味着控制倒置。如果你控制listen循环,那么你可以使用递归或状态monad。如果你不这样做,那么你最好的是Functional Reactive Programming (FRP)

Scala中至少有两个FRP框架。一个是EPFL,我不知道它与生产水平有多接近,也不知道确切的名称(尽管我认为它是反应性的),另一个叫做Reactive,它已经相当成熟了。此外,它的作者在Stack Overflow上查看Scala问题,因此您可以在这里获得帮助。