Scalaで有限状態機械(または有限状態トランスデューサ)を実装する一般的な方法は何ですか?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を作成するにはどうすればよいですか?
にFSM-グラフを描画するために非常に良いでしょうアッカFSMだけではなく、オブジェクト名を与え、国家といくつかのデータを関連付けすることを可能にする優れた特性を有しています。これも感謝しています。 (ただし、アッカFSMは、それが非同期で、時には少し重いですとして使用するために、常に便利ではありません。)
FSMは、相互に再帰的な関数として表現するときれいになります。本当のテールコールがそこに鍵となるので、Scalaはそれをカットしません。あなたの 'var'を避けるためには、メッセージとともに次の状態を返して、関数をそれ自身に送り続けてください。あなたは効果的に 'State'型を構築しています。 –
Akkaフレームワークは有用なステートマシン実装を持っていますが、アクターシステムの周りにメッセージを送信することに依存しています。もっと読む[ここ](http://doc.akka.io/docs/akka/2.2.3/scala/fsm.html) –