鉴于这些F#类型声明...递归变量定义
type Message =
| MessageA
| MessageB
| MessageC
| MessageD
type State = {
Name:string
NextStateMap: Map<Message,State>
}
...有没有这种特定的状态机的一个同样表现定义...
let rec state0 = { Name = "0"; NextStateMap = Map.ofList [ (MessageA,state1); (MessageB,state2)] }
and state1 = { Name = "1"; NextStateMap = Map.ofList [ (MessageB,state3)] }
and state2 = { Name = "2"; NextStateMap = Map.ofList [ (MessageA,state3)] }
and state3 = { Name = "3"; NextStateMap = Map.ofList [ (MessageC,state4)] }
and state4 = { Name = "4"; NextStateMap = Map.ofList [ (MessageD,state5)] }
and state5 = { Name = "5"; NextStateMap = Map.empty}
...用Python?请注意,通过“rec”,我们不必按由拓扑排序定义的顺序进行赋值......(例如,state0是根据state1定义的,即使state1是稍后定义的)。
P.S.使用字符串作为国家标识符的选项...
stateMachine = {
"0" : { "A":"1", "B":"2"},
"1" : { "B":"3" },
...
...叶子打开无效键(在状态机即无效消息说明符)的情况下。
您使用的静态类型来创建一个状态机,Python是动态类型。 – wheaties 2011-02-25 16:00:51
我很抱歉,尽管解释器检查尽可能多的东西是一个明智的策略,不管Python的非静态类型的本质。请参阅下面Duncan的回答。 – ttsiodras 2011-02-25 16:10:29
我同意wheaties。下面的答案不能阻止无效密钥的情况。毕竟我可以拥有包含“{message_a:state1,message_b:”的任何内容但不是状态的字典},解释器不会检查任何内容。因为解释者_在这种情况下不检查任何东西。 – 2011-02-27 00:48:24