考虑以下状态机:
class AudioRecorder {
private var currentState = Idle
def buttonTapped() = currentState match {
case Idle =>
currentState = Recording
// start recording...
case Recording =>
currentState = Stopped
// stop recording...
}
}
它是有效的,但状态和丑陋。
不幸的是,在许多情况下,我需要处理这种带有连续事件的状态机,尤其是在UI设置中。
虽然我不太确定我问的问题是否正确,但是, 有没有更好的方法来建模这种用连续&非确定性事件 我已经使用akka在服务器端使用Actor模型对此进行了建模,但我还没有看到任何人在UI设置中使用Actor模型。 此外,值得注意的是,不能在每个State Monad
似乎是一个解决方案,但到目前为止,通过我的学习,它只有在您可以提前实际布局状态事件的所有序列时才有用,这样您就可以通过flatMap
将它们全部连接起来,但在状态事件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)
}