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

これは、1 つのキーを押すだけで応答するブロックなしのバージョンです。

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 に答える