Я пытаюсь создать простой конечный автомат в F #, но проблема с работой двух состояний с круговыми зависимостями.
У меня есть этот государственный завод:Как получить рабочий конечный автомат в F #, используя функции для представления состояний?
open System
let createState produceInput stateSwitchRule nextState =
let rec stateFunc() =
match produceInput() with
| x when x = stateSwitchRule -> printfn "%s" "Switching state"; nextState()
| _ -> printfn "%s" "Bad input. Try again"; stateFunc()
stateFunc
, который я использую для создания двух взаимно рекурсивных состояния:
let rec pongState() = createState Console.ReadLine "go to ping" pingState
and pingState = createState Console.ReadLine "go to pong" (pongState())
[<EntryPoint>]
let main argv =
pingState()
0
pingState()
При вызове и ввод «идти в теннис» состояние переключается в теннис. Но при вызове ввода «go to ping» генерируется исключение нулевой ссылки.
Есть ли все-таки вокруг этого с выбранным подходом или я должен моделировать его по-другому?
Ваш образец не компилируется - он дает мне ошибку ограничения значения на 'и pingState' – Petr
Это странно; Я получаю ту же ошибку компиляции в файле fsx, но не в файле fs (добавлен код программы к приведенному выше примеру) – Christian