С учетом этих объявлений типа 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}
... withPython?
Обратите внимание, что с помощью "rec" нам не нужно было выполнять присваивания в порядке, определенном топологической сортировкой ... (например, state0 определяется в терминах state1, даже если state1 определенопозже).
PS Возможность использования строк в качестве идентификаторов состояния ...
stateMachine = {
"0" : { "A":"1", "B":"2"},
"1" : { "B":"3" },
...
... оставляет открытым случай недопустимых ключей (то есть недопустимых спецификаторов сообщений в конечном автомате).).