【发布时间】:2013-08-16 02:50:09
【问题描述】:
在 Scala 中实现有限状态机(或有限状态转换器)的一般方法是什么?
我经常发现自己需要状态机实现。我的典型实现看起来像
object TypicalFSM { // actually — finite state transducer
type State
case object State1 extends State
case object State2 extends State
type Message
case object Message1 extends Message
type ResultMessage
case object ResultMessage1 extends ResultMessage
}
import TypicalFSM._
class TypicalFSM extends ((Message) =>Seq[ResultMessage]){
var state:State = State1
def apply(message:Message):Seq[ResultMessage] = (state, message) match {
case (State1, Message1) =>
state = State2
Seq(ResultMessage1, ResultMessage2)
}
}
我不喜欢的是可变的var,它使解决方案线程不安全。 FSM拓扑也不清楚。
如何以实用的方式创建 FSM?
在.dot format中画FSM-graph也很好
Akka FSM 具有允许将某些数据与状态相关联的良好属性,而不仅仅是提供对象名称。这也值得赞赏。 (但是,Akka FSM 并不总是很方便使用,因为它是异步的,有时有点重。)
【问题讨论】:
-
FSM 在表示为相互递归函数时可以很漂亮。但是,真正的尾调用是关键,因此 Scala 不会削减它。为避免您的
var,只需将下一个状态与消息一起返回,并继续将函数提供给自身。您正在有效地构造State类型。 -
Akka 框架有一个有用的状态机实现,但它相当依赖于在参与者系统周围发送消息。你可以阅读更多here
标签: scala state-machine fsm transducer