F#中的无限主循环

Arn*_*hor 14 f# design-patterns functional-programming

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

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

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

des*_*sco 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()
Run Code Online (Sandbox Code Playgroud)

  • 如果没有打开尾递归,它会溢出堆栈吗? (7认同)

gra*_*bot 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()
Run Code Online (Sandbox Code Playgroud)

  • @nphx F#支持尾递归.这允许递归代码以F#编写,不会溢出,并且与循环版本一样快.尝试搜索"F#tail recursion". (2认同)

Dan*_*iel 5

这样的功能很有用:

let rec forever f = 
  f()
  forever f
Run Code Online (Sandbox Code Playgroud)

用法:

forever <| fun () ->
  //function body
Run Code Online (Sandbox Code Playgroud)

但是,对代码进行更直接的翻译将是:

while true do
  //body
Run Code Online (Sandbox Code Playgroud)