Бесконечная основная петля в F #

Обычный шаблон для приложения CLI должен запускаться в бесконечном цикле, пока пользователь не наберет некоторую команду quit. Например, на языке C:

while(1){
scanf("%c", &op);
    ...
    else if(op == "q")
        break;
    }

Каким будет шаблон для такого консольного приложения в F # (пытался использовать tail recursrion, но не удалось)?

Ответ 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()

Ответ 2

Здесь нет блокирующей версии, которая реагирует на нажатие одной клавиши.

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()

Ответ 3

Такая функция может быть полезна:

let rec forever f = 
  f()
  forever f

Использование:

forever <| fun () ->
  //function body

Более буквальный перевод вашего кода, однако, будет следующим:

while true do
  //body

Ответ 4

Кроме

while true do
    (* ..code.. *)

Но я думаю, что хвостовая рекурсия более причудлива (они оба скомпилируются в одно и то же в --optimize).