Рекурсивные определения переменных в Python и F # (возможно, OCaml, тоже)

Учитывая эти объявления типов 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 определяется позже).

PS Возможность использования строк в качестве идентификаторов состояния ...

stateMachine = {
   "0" : { "A":"1", "B":"2"},
   "1" : { "B":"3" },
...

... оставляет открытым случай недопустимых ключей (то есть недопустимых спецификаторов сообщений в конечном автомате).

5
задан ttsiodras 25 February 2011 в 15:48
поделиться