【问题标题】:How to do this Scala exercise in functional way?如何以功能方式进行此 Scala 练习?
【发布时间】:2014-03-06 04:01:55
【问题描述】:

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

我可以用 State 模式用 Java 编写它(请参阅下面的详细信息):

...

应用程序有 2 种状态:当用户拖动形状时,空闲状态和拖动状态。它以 IDLE 开头。

两种状态都处理 3 个鼠标事件:

  • 鼠标按下
  • 鼠标松开
  • 鼠标移动

IDLE 处理鼠标事件如下:

  • 鼠标按下如果鼠标位置在形状内部,则移动到拖动状态
  • 鼠标释放鼠标移动什么都不做

DRAGGING 按如下方式处理它们:

  • 鼠标释放移动到空闲状态
  • 鼠标释放什么都不做
  • 鼠标移动上移动形状

...

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

【问题讨论】:

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


【解决方案1】:

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

Scala 中至少有两个 FRP 框架。一个是 EPFL 的,不知道离生产水平有多近,也不知道具体的名字(虽然我觉得是 Reactive),另一个叫Reactive,比较成熟。此外,它的作者在 Stack Overflow 上查看 Scala 问题,因此您可能会在此处获得帮助。

【讨论】:

  • 假设我确实控制了事件循环。你能在这里展示如何使用递归或状态单子吗?
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多