2016-05-03 6 views
1

私はカードゲームをプログラムしようとしていると、いくつかの時点で、ユーザが要求されます:関数型プログラミングを使ってOCamlでループを回避する方法はありますか?

を「ゲームを開始するために、プレイヤーの名前やEXITを提出してください」そこで私は、ユーザまで、この質問をする必要があります"EXIT"を送信すると、ループを使わずにこれを行う方法があると言われています。

printf("Ingrese el nombre del jugador o EXIT para comenzar el juego");; 
print_newline;; 
let command = read_line;; 

そしてそこに私は、ループ使用します:

は、これまでのところ私が持っていたすべてだった

while (command <> "EXIT") do 

をしかし、関数型プログラミングを行っているとき、それは良くない助言されました。

ありがとうございます。

答えて

3

ジェフリーの答えは少しきれいにするには:

+1

説明のビット。この機能(例外処理とのブレンドパターンマッチング)は、OCaml 4.02以降で利用可能になりました。 @ JeffreyScofieldはtail-recursiveバージョンを実装しているので、少し複雑に見えます。素敵な[ブログの投稿](https://blogs.janestreet.com/pattern-matching-and-exception-handling-unite/)はこれをすべて説明しています。 –

+0

@AntonTrunov、このバージョンはまだテール再帰的です。 –

+0

はい、私は@ Jeffreyのバージョンは、この比較的新しい機能を使用せずにテール再帰的なバージョンを実装すると言っているはずです:) –

0

コマンドが「EXIT」のときに終了する再帰関数を使用するだけです。ここで

0

は、ワードEXIT(またはファイルの末尾)からなるラインを見るまで標準入力からテキスト行を読み込む機能である:

let rec read_until_exit() = 
    match 
     try Some (read_line()) 
     with End_of_file -> None 
    with 
    | None ->() 
    | Some s -> 
     if s = "EXIT" then() 
     else 
      begin 
      do_something_you_want_to_do_here_with_the_line s; 
      read_until_exit() 
      end 
+0

「EXIT」が表示されない場合は、機能はそのままになりますが、何もしないでください。また、「()」は機能を終了することを意味しますか?最終的に別の行を追加するにはどうすればいいのでしょうか?つまり、最後のケースで新しいプレーヤーを作成することを意味します。 –

+0

はい、この関数は何もしません。それは単なる例です。値 '()'は関数によって返されますが、特別なことは何もありません。この関数は、(同じ型の)好きな2つの値を返すようにすることができます。私はあなたが関数内で何ができるかを示すコメントを追加します。 (サイドコメントとして、OCamlチュートリアルを試してみることをお勧めします)。 –

+0

Nit:このコードを少し醜いものにするいくつかの方法を想像することができます、以下の私の答えを参照してください。 :) –