Каков общий способ реализации конечного автомата (или преобразователя конечного состояния) в 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 не ясна.
Как создать FSMs функциональным способом?
Это также было бы очень хорошо, чтобы нарисовать FSM-граф в .dot format
Akka FSM имеет хорошее свойство позволяет связать некоторые данные с государством, не только давая имя объекта. Это также приветствуется. (Тем не менее, Akka FSM не всегда удобно использовать, поскольку это асинхронный и иногда немного тяжеловесный.)
FSM могут быть красивыми, если они выражаются как взаимно рекурсивные функции. Реальные хвостовые звонки являются ключевыми там, тем не менее, поэтому Scala не сократит его. Чтобы избежать «var», просто верните следующее состояние вместе с сообщениями и продолжайте кормить функцию в себе. Вы эффективно создаете тип «State». –
Структура Akka имеет полезную реализацию конечного автомата, но она скорее зависит от отправки сообщений вокруг системы актеров. Вы можете прочитать больше [здесь] (http://doc.akka.io/docs/akka/2.2.3/scala/fsm.html) –