3

我有一个状态机,我想使用 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

在我的脑海中,这将由 a Process1[I, O]、 wheretype 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并返回物理?ServerStateProcess1

我正在努力了解如何“携带”目前无法执行的消息。

例子:

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
4

1 回答 1

3

我认为你应该能够通过这样的递归来编码你的状态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)
      ...
    }
  }
}

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

于 2015-03-05T06:38:49.280 回答