Jaki jest ogólny sposób wdrożenia skończonej maszyny stanów (lub skończonego przetwornika stanu) w Scali?Generalna maszyna skończona (przetwornik) w Scali
Często znajduję się w potrzebie wdrożenia maszyny państwowej. Moja Typowa implementacja wygląda
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)
}
}
Co lubię jest zmienny var
co sprawia, że nić rozwiązanie niebezpieczne. Również topologia FSM nie jest jasna.
Jak tworzyć FSM w sposób funkcjonalny?
To również byłby bardzo dobry rysować FSM-Graph w .dot format
Akka FSM ma dobre właściwości pozwalające skojarzyć niektóre dane z państwa, nie tylko podając nazwę obiektu. Jest to również doceniane. (Jednak Akka FSM nie zawsze jest wygodny w użyciu, jak to jest asynchroniczne i czasami nieco wagi ciężkiej.)
FSM mogą być piękne, gdy są wyrażone jako funkcje rekurencyjne. Prawdziwe ogonki są jednak kluczowe, więc Scala ich nie przerwie. Aby ominąć 'var', po prostu zwróć następny stan wraz z komunikatami i kontynuuj karmienie funkcji w sobie. Skutecznie budujesz typ "State". –
Struktura Akka ma przydatną implementację automatu stanów, ale jest raczej zależna od wysyłania komunikatów wokół systemu aktora. Możesz przeczytać więcej [tutaj] (http://doc.akka.io/docs/akka/2.2.3/scala/fsm.html) –