14

CLI 应用程序的一个常见模式是无限循环运行,直到用户键入一些退出命令。就像,在 C 语言中:

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

F# 中此类控制台应用程序的模式是什么(尝试使用尾递归,但失败)?

4

4 回答 4

11

在浏览器中输入,因此可能包含错误:

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()
于 2012-04-16T17:27:28.740 回答
11

这是一个响应单键按下的无阻塞版本。

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()
于 2012-04-16T18:07:34.660 回答
6

这样的功能可能很有用:

let rec forever f = 
  f()
  forever f

用法:

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

但是,您的代码的更直译是:

while true do
  //body
于 2012-04-16T18:05:02.507 回答
4

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

但我猜尾递归更花哨(它们都会在 下编译成相同的东西--optimize)。

于 2012-04-16T17:57:35.843 回答