Qual è il modo generale di implementare una macchina a stati finiti (o trasduttore di stato finito) in Scala?Macchina a stati finiti generali (trasduttore) in Scala
Spesso mi trovo in difficoltà per l'implementazione della macchina di stato. La mia tipica implementazione sembra
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)
}
}
Quello che mi piace è il mutabile var
che rende il filo soluzione non sicuri. Anche la topologia dell'FSM non è chiara.
Come creare FSM in modo funzionale?
Sarebbe anche molto buona per disegnare FSM-grafico in .dot format
Akka FSM ha una buona proprietà di permettere di associare alcuni dati con uno Stato, non solo dando un nome di oggetto. Questo è anche apprezzato. (Tuttavia, Akka FSM non è sempre comodo da usare in quanto è asincrona e talvolta una pesante bit.)
Gli FSM possono essere belli se espressi come funzioni reciprocamente ricorsive. La vera coda è fondamentale, tuttavia, in modo che Scala non lo tagli. Per evitare il tuo 'var', basta restituire lo stato successivo insieme ai messaggi, e continuare ad alimentare la funzione in se stesso. Stai effettivamente costruendo il tipo 'State'. –
Il framework Akka ha un'implementazione della macchina di stato utile, ma dipende piuttosto dall'invio di messaggi attorno a un sistema di attori. Puoi leggere di più [qui] (http://doc.akka.io/docs/akka/2.2.3/scala/fsm.html) –