State Monad的持续状态事件

时间:2015-12-15 09:32:16

标签: scala state monads state-machine state-monad

考虑以下状态机:

class AudioRecorder {
  private var currentState = Idle

  def buttonTapped() = currentState match {
    case Idle => 
      currentState = Recording
      // start recording...

    case Recording =>
      currentState = Stopped
      // stop recording... 
  }
}

它有效,但有状态和丑陋。

不幸的是,我有很多情况需要使用连续事件来处理这种状态机,尤其是在UI设置中。

似乎State Monad是解决这个问题的方法,但到目前为止,通过我的学习,它只有在您可以预先布置状态事件的所有序列时才有用,这样您就可以通过flatMap将它们全部连接起来,但是当状态事件是连续的并且不确定时(如果用户点击时)则不是这样 - 但如果我错了,请纠正我。

虽然我不太确定我是否在问正确的问题但是,

是否有更好的方法来模拟这种状态机,它可以通过连续和更改来改变其行为。非确定性事件?

我使用akka在服务器端使用 Actor Model 对其进行了建模,但我还没有看到任何人在UI设置中使用actor模型。

同样值得注意的是,AudioRecorder无法在每个buttonTapped事件上重新创建以返回新实例(这可能会导致状态问题消失),因为它保留了许多其他状态太昂贵了,无法在每个信号上重新创建。

1 个答案:

答案 0 :(得分:0)

将FRP与rxscala一起使用,您可以封装可变对象并隐藏它。

它可能如下所示(未编译的代码):

class FrpRecorder(button: Observable[Unit]) {
  private val recorder = new AudioRecorder

  button.subscribe(_ => recorder.buttonTapped())

  val recordingLength: Observable[Double] = 
    interval("100ms").map(_ => recorder.recordingLength)

}