F#中的无限主循环

时间:2012-04-16 17:23:06

标签: design-patterns f# functional-programming

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

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

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

4 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:10)

这是一个非阻止版本,可响应单键按下。

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

答案 2 :(得分:5)

这样的功能很有用:

let rec forever f = 
  f()
  forever f

用法:

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

然而,代码的更直译是:

while true do
  //body

答案 3 :(得分:4)

另外

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

但我觉得尾递归更加花哨(他们都会在--optimize下编译成同样的东西)。