与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模型对此进行了建模,但我还没有看到任何人在UI设置中使用Actor模型。


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

使用带有rxscala的FRP可以封装可变对象并隐藏它。

它可能看起来像以下(未编译的代码):

class FrpRecorder(button: Observable[Unit]) {
  private val recorder = new AudioRecorder
  button.subscribe(_ => recorder.buttonTapped())
  val recordingLength: Observable[Double] = 
    interval("100ms").map(_ => recorder.recordingLength)
}

最新更新