通过 Process1 传感器对 FSM 建模?

Modeling a FSM via Process1 transducer?

我有一个状态机,我想使用 scalaz-stream Process1 对其进行建模。

状态机模拟客户端和服务器之间的消息流。

一组基本数据类型可能是:

sealed trait ServerState
case object Disconnected extends ServerState
case object Authenticating extends ServerState
case object Idle extends ServerState
case object Busy extends ServerState

sealed trait Message
case object Query extends Message
case object StartupMessage extends Message
case object AuthenticationOk extends Message
case object QueryResponse extends Message

在我看来,这将由 Process1[I, O] 建模,其中 type I = Messagetype O = scalaz.State[Message, ServerState]

就像是一团雾 - 我可以看到解决方案的轮廓,但它的确切定义让我无法理解。

目前我有这样的东西

type Transition = scalaz.State[Message, ServerState]
val connecting = Transition { StartupMessage => (StartupMessage, Authenticating) }
def fsm(state: Transition): Process1[Message, Transition] = {
  Await [Message, Transition] { msg =>
    case (connecting, AuthenticationOk) => Emit1(connecting) 
  }
}

我知道这是错误的,但我无法弄清楚状态转换需要存在于何处。

进程是否应该接受 Message 和 return 物理 ServerStateProcess1 驱动程序处理内部状态?

我正在努力查看如何 "carry along" 此时无法执行的消息。

示例:

1. Current ServerState = Disconnected
2. StateMachine gets Query Message
3. StateMachine must send StartupMessage, ServerState now equals = Authenticating
4. StateMachine receives AuthenticationOk, ServerState now equals Idle
5. StateMachine must now sends original query message, ServerState now equals Busy
6. StateMachine gets QueryResponse, ServerState now equals Idle

我认为你应该能够通过这样的递归Process1[Message, Message]来编码你的状态机

def fsm(state: ServerState): Process1[Message, Message] = {
  receive1 { msg: Message =>
    (msg, state) match {
      case (Query, Disconnected) => 
        emit(StartupMessage) fby fsm(Authenticating)
       case (AuthenticationOk, Authenticating) => 
         fsm(Idle)
      ...
    }
  }
}

您可能希望通过 Process1[InMessage, OutMessage]