Ответ 1
Ввод в браузере, поэтому могут содержать ошибки:
let rec main() =
let c = System.Console.ReadKey()
if c.Key = System.ConsoleKey.Q then () // TODO: cleanup and exit
else
// TODO: do something in main
main()
Обычный шаблон для приложения CLI должен запускаться в бесконечном цикле, пока пользователь не наберет некоторую команду quit. Например, на языке C:
while(1){
scanf("%c", &op);
...
else if(op == "q")
break;
}
Каким будет шаблон для такого консольного приложения в F # (пытался использовать tail recursrion, но не удалось)?
Ввод в браузере, поэтому могут содержать ошибки:
let rec main() =
let c = System.Console.ReadKey()
if c.Key = System.ConsoleKey.Q then () // TODO: cleanup and exit
else
// TODO: do something in main
main()
Здесь нет блокирующей версии, которая реагирует на нажатие одной клавиши.
open System
let rec main() =
// run code here
// you may want to sleep to prevent 100% CPU usage
// Threading.Thread.Sleep(1);
if Console.KeyAvailable then
match Console.ReadKey().Key with
| ConsoleKey.Q -> ()
| _ -> main()
else
main()
main()
Такая функция может быть полезна:
let rec forever f =
f()
forever f
Использование:
forever <| fun () ->
//function body
Более буквальный перевод вашего кода, однако, будет следующим:
while true do
//body
Кроме
while true do
(* ..code.. *)
Но я думаю, что хвостовая рекурсия более причудлива (они оба скомпилируются в одно и то же в --optimize
).