Was ist der allgemeine Weg, um eine endliche Zustandsmaschine (oder endlicher Zustandswandler) in Scala zu implementieren?Allgemeine endliche Maschine (Transducer) in Scala
Ich bin oft auf die Implementierung von Zustandsautomaten angewiesen. Meine typische Implementierung sieht aus wie
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)
}
}
Was ich nicht mag die wandelbar var
ist, die die Lösung Faden unsicher macht. Auch die FSM-Topologie ist nicht klar.
Wie können Sie FSMs funktional erstellen?
Es wäre auch sehr gut sein FSM-Grafik zu zeichnen in .dot format
Akka FSM hat eine gute Eigenschaft, so dass einige Daten mit einem Staat zu verbinden, nicht nur einen Objektnamen zu geben. Dies wird auch geschätzt. (Allerdings ist Akka FSM nicht immer bequem zu verwenden, wie es asynchron ist und manchmal etwas schwergewichtige.)
FSMs können schön sein, wenn sie als gegenseitig rekursive Funktionen ausgedrückt werden. Reale Tail-Calls sind jedoch der Schlüssel, also wird Scala es nicht schneiden. Um Ihre 'var' zu vermeiden, geben Sie einfach den nächsten Zustand zusammen mit den Nachrichten zurück und füttern Sie die Funktion in sich hinein. Sie erstellen effektiv den Typ "State". –
Das Akka-Framework hat eine nützliche State-Machine-Implementierung, ist aber eher abhängig vom Senden von Nachrichten um ein Aktorsystem. Sie können mehr lesen [hier] (http://doc.akka.io/docs/akka/2.2.3/scala/fsm.html) –